LL exGcd(LL a,LL b,LL &x,LL &y) { if(!b) { x=1,y=0; return a; } LL d=exGcd(b,a%b,y,x); y=y-a/b*x; return d; } LL chineseRemainder(LL n,LL *a,LL *b)///a是余数,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) ans=-1; else { x=x*((a1-a2)/gcd); x=x%(b2/gcd); a1=a1-x*b1; b1=b1/gcd*b2; a1=a1%b1; } } if(ans!=-1) ans=(a1%b1+b1)%b1; if(!ans) ans=b1; return ans; }
笔记:
里面有一个 gcd 的参数,他所代表的意义就是 ax+by 的最小值,之后我就可以根据这个数对 a,b所
对应的最小值进行翻倍处理就可以得到想要的 c 值,如果 c % gcd != 0 则表示函数没有解。