中国剩余定理
/*
设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); }