拓展中国剩余定理(不互质的情况)

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

 

posted @ 2016-04-18 12:24  __560  阅读(604)  评论(0编辑  收藏  举报