每次合并两个同余模方程,然后用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;}