每次合并两个同余模方程,然后用exgcd解即可。
ll LCM(ll a,ll b) { return a/__gcd(a,b)*b; } void exgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(b==0){ x=1;y=0;d=a; return; } exgcd(b,a%b,d,y,x); y-=x*(a/b); } ll MLE(ll a,ll b,ll n) { ll x,y,d; exgcd(a,n,d,x,y); if(b%d) return -1; x*=(b/d); return (x%n+n)%n; } ll ex_china(ll *a,ll *m,int n) { ll x,y,d; ll M=1,A=0; REP(i,1,n){ ll k=MLE(m[i],A-a[i],M); if(k==-1) return -1; A=k*m[i]+a[i]; M=LCM(M,m[i]); } return (A+M)%M; }
时间: 2024-10-08 22:05:23