中国剩余定理

/*

设a≡b[i](mod w[i)

i=1->n;  

我们记k=w[1]*w[2]*w[3]*……*w[n]  

则方程组在mod k 同余的意义下有唯一解  

我们令x=(k/w[i])*yi 

那么方程等价于(k/w[i])y≡1(mod w[i])  

那么方程组的解x0=b1x1+b2x2+...+bnxn(mod k)

*/

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,w[1010],b[1010],x,y,a,k=1,j;
long long exgcd(long long aa,long long bb)
{
    if(bb==0)
    {
        x=1;
        y=0;
        return aa;
    }
    long long _gcd=exgcd(bb,aa%bb);
    long long kk=x;
    x=y;
    y=kk-aa/bb*y;
    return _gcd;
}//扩欧求解方程
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&w[i],&b[i]);
    for(int i=1;i<=n;i++)k*=w[i];//求k
    for(int i=1;i<=n;i++)
    {
        j=k/w[i];
        exgcd(w[i],j);/*解方程(k/w[i])y≡1(mod w[i])*/
    a=(a+y*j*b[i])%k;/*累加*/
   }
      if(a<0)a+=k;
      printf("%lld",a); 

}

 

posted @ 2018-04-22 20:52  _ZZH  阅读(125)  评论(0编辑  收藏  举报