最近被数论折磨得质壁分离0.0
咳咳
说正事
中国剩余定理又称孙子定理0.0
跟小学奥数差不多
就是给出有个数整数好几个互质的数的余数和除数
然后让你求最小是多少
推演比较麻烦。。
具体求解方法就是:
设余数为a1~j,
求出除数m1,m2···mj的乘积m
然后求出m/m1=b1,b1*x1 mod m1 余1,
用这个求出x1,类比求出x1~j,
最后x=bi*xi*ai(i=1~j),
用x%m求出来一个数y,
被除数=y+m*k,最小的救是y
附个代码:
#include<iostream>
#include<cstdio>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if(b==0){
x=1,y=0;
return a;
}
int gcd=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return gcd;
}
int China(int w[],int b[],int k)
{
int x,y,a=0,m,n=1;
for(int i=0;i<k;i++) n*=w[i];
for(int i=0;i<k;i++){
m=n/w[i];
exgcd(w[i],m,x,y);
a=(a+y*m*b[i])%n;
}
if(a>0) return a;
else return a+n;
}
int main()
{
int w[100],b[100],num;
cin>>num;
for(int i=0;i<num;i++)
{
cin>>b[i]>>w[i];
}
int ans=China(w,b,num);
cout<<ans;
return 0;
}
//5
//1 2
//1 3
//1 5
//1 7
//2 11