对于
(
s
)
:
{
x
≡
a
1
(
m
o
d
m
1
)
x
≡
a
2
(
m
o
d
m
2
)
x
≡
a
3
(
m
o
d
m
3
)
.
.
.
x
≡
a
n
(
m
o
d
m
n
)
(s): \begin{cases} x\equiv a_1 &(mod & m_1) \\ x\equiv a_2 &(mod &m_2)\\ x\equiv a_3 &(mod &m_3)\\ ... \\x\equiv a_n &(mod &m_n)\\ \end{cases}
(s):⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x≡a1x≡a2x≡a3...x≡an(mod(mod(mod(modm1)m2)m3)mn)
我们求一组通解
易知通解为
∑
i
=
1
n
a
i
⋅
M
i
⋅
t
i
\sum _{i=1}^na_i\cdot M_i\cdot t_i
∑i=1nai⋅Mi⋅ti
其中
M
=
∏
i
=
1
n
m
i
M=\prod_{i=1}^nm_i
M=i=1∏nmi
M
i
=
M
m
i
M_i=\dfrac{M}{m_i}
Mi=miM
t
i
⋅
M
i
≡
1
(
m
o
d
m
)
t_i \cdot M_i\equiv 1 (mod m)
ti⋅Mi≡1(modm)
容易看出来这样构造出的解周期为
M
M
M,只要在最后的解中
%
M
\%M
%M即可
Code
#include<cstdio>
#include<iostream>
using namespace std;
struct poi
{
int mod,res,m,nm;
}a[10005];
int n;
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return ;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
return ;
}
int main()
{
cin>>n;
int kkk=1;
for(int i=1;i<=n;i++)
{
cin>>a[i].mod>>a[i].res;
kkk*=a[i].mod;
}
for(int i=1;i<=n;i++)
{
a[i].m=kkk/a[i].mod;
//cout<<a[i].m<<endl;
}
int total=0;
for(int i=1;i<=n;i++)
{
int x,y;
exgcd(a[i].m,a[i].mod,x,y);
//cout<<x<<endl;
a[i].nm=(x%a[i].mod+a[i].mod)%a[i].mod;
//cout<<a[i].nm<<endl;
total+=a[i].m*a[i].nm*a[i].res;
}
total%=kkk;
cout<<total;
}