中国剩余定理

问题:

   

其中任意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);
}

 

posted @ 2017-12-07 23:19  尹吴潇  阅读(121)  评论(0编辑  收藏  举报