已知:
Num%m[1]=a[1];
Num%m[2]=a[2];
Num%m[3]=a[3];
︙ ︙ ︙
Num%m[n]=a[n];
求解Num的最小整数解 :
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100000+5;
int n;
LL m[maxn];//除数
LL a[maxn];//余数
LL ex_gcd(LL a,LL b,LL &x,LL &y)//拓展欧几里得
{
if(b==0)
{
x = 1;
y = 0;
return a;
}
LL g=ex_gcd(b,a%b,x,y);
LL temp=x;
x=y;
y=temp-a/b*y;
return g;
}
LL inv(LL a,LL b)//求逆元
{
LL x,y;
LL g=ex_gcd(a,b,x,y);
if(g!=1)
{
return -1;
}
if(x<0)
{
x=(x%b+b)%b;
}
return x;
}
LL China()//中国剩余定理
{
LL M = 1;
for(int i=1;i<=n;i++)
{
M*=m[i];
}
LL sum=0;
for(int i=1;i<=n;i++)
{
LL res=M/m[i];
sum=(sum+a[i]*res*inv(res,m[i]))%M;
}
return sum;
}
int main()
{
while(cin >> n)
{
for(int i=1;i<=n;i++)
{
cin >> m[i] >> a[i];
}
LL ans=China();
cout << ans << endl;
}
return 0;
}