中国剩余定理
问题:
其中任意mi之间互质
求最小的x使其满足上式子
令$ N=\prod {mi} $
令N=m1*m2....*mn;
可以证明,在N以内有一解满足上式
对于每一个式子,不妨设x=(N/mi)*y;(注意到此处y可能为小数,但在%n意义下其有对应整数)
问题此时等价为(N/mi)*y同余1(mod mi),即扩展欧几里得算法
最终所求x即(N/mi)*y*a[i]
而综合所有式子x总=x1+x2+...+xn;
原理:对于每一个mi,xj(j!=i) mod mi=0,所以对其不造成影响
代码
int gcd(int a,int b,int &x,int &y) { if (b==0) { x=1; y=0; return(a); } int tmp=gcd(b,a%b,y,x); y-=(a/b)*x; return(tmp); } int china(int n) { int M=1,ans=0,x,y,d; for (int i=0; i<n; i++) { M*=m[i]; } for (int i=0; i<n; i++) { int mi=M/m[i],x,y; gcd(mi,m[i],x,y); ans=(ans+a[i]*mi*x)%M; } return((ans+M)%M); }