模线性方程组(中国剩余定理)

来源:互联网 发布:hishop销客多源码 编辑:程序博客网 时间:2024/05/16 07:02

hiho – 1303
//解法和说明题面已经说的很清楚了. 下面就给出代码实现.

/** @Cain*/const int maxn=1e4+5;ll m[maxn],r[maxn];int n;ll ex_gcd(ll a,ll b,ll &x,ll &y){    if(!b){        x = 1;        y = 0;        return a;    }    ll r = ex_gcd(b,a%b,x,y);    ll tmp = x;    x = y;    y = tmp - a/b*y;    return r;}ll tongyu(){    ll M = m[1],R = r[1];    for(int i=2;i<=n;i++){        ll d = __gcd(m[i],M);        ll c = r[i] - R;        if(c%d) return -1;   //无解        ll k1,k2;        ex_gcd(M/d,m[i]/d,k1,k2);   //扩展GCD求解        k1 = ( k1* c/d ) % (m[i] / d);//别忘了扩充解系.!!!不懂的看看原理.        R = R + k1*M;       // 计算x = m[1]*k[1] + r[1];(当然用k2也是可以的)        M = M / d * m[i];     //求解LCM(M,m[i]);        R %= M;             //求解合并后的新R,同时让R最小.        //这些不理解的话写几个出来就懂了.    }    if( R < 0) R += M;    return R;}void solve(){    cin >> n;    for(int i=1;i<=n;i++) cin >> m[i] >> r[i];    cout << tongyu() << endl;}
阅读全文
0 0