LL exGcd(LL a,LL b,LL &x,LL &y) { if(!b) { x=1,y=0; return a;///上面提到的 gcd 值 } LL d=exGcd(b,a%b,y,x); y=y-a/b*x;///还原x , y 的必要操作。 return d; } LL chineseRemainder(LL n,LL *a,LL *b) { LL a1=0,a2,b1=1,b2,x,y,ans=0,gcd; for(int i=0;i<n;i++) { b2=b[i],a2=a[i]; gcd=exGcd(b1,b2,x,y); if((a1-a2)%gcd) return -1;///无解的时候的返回值 else { x=x*((a1-a2)/gcd); x=x%(b2/gcd);///得出x的最小值(->0) a1=a1-x*b1; b1=b1*b2/gcd;///LCM a1=a1%b1; } } ans=(a1%b1+b1)%b1; if(!ans)///防止余数时为0 ans=b1; return ans; }