拓展中国剩余定理

拓展中国剩余定理

引入

我们知道中国剩余定理的约束条件:模数必须全都互质。

那么当模数不互质的情况该怎么办呢?这时候就要用到 拓展中国剩余定理

实现

形如:

\[x\equiv a\pmod b \]

我们可以转换成:

\[ax+b=x \]

这样叠加起来,就有:

\[a_1x_1+b_1=x\\ a_2x_2+b_2=x \]

然后就可以转化成:

\[a_1x_1-a_2x_2=b_2-b_1 \]

那么这个式子有解,则

\[\gcd(a_1,a_2)|(b_2-b_1) \]

利用 \(exgcd\) 算出来这个式子:

\(a_1x_1-a_2x_2=\gcd(a_1,a_2)\)的一个解 \(x\)

然后将

\[x *\frac{b_2-b_1}{\gcd(a_1,a_2)} \]

回代得到原来 \(x\) 的解 \(x'\)

同时,我们可以用:

\[x\equiv x'\pmod {lcm(a_1,a_2)} \]

我们可以每次合并两个方程,最终得到一个同余方程,就可以求解了。

线性求得最后的 \(b_1\) 就是这个方程的最终解。

代码:

inline ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){ x=1,y=0;return a;}
    ll res=exgcd(b,a%b,x,y);
    ll t=x; x=y,y=t-a/b*y;
    return res;
}

inline ll excrt(){
    ll a1=a[1],b1=b[1],x,y;
    for(int i=2;i<=n;i++){
        ll b2=b[i],a2=a[i];
        ll x1=exgcd(a1,a2,x,y);//求出a1x1+a2x2=b2-b1的解x1(exgcd)
        if((b2-b1)%x1) return -1;//不存在解(裴蜀)
        x=(b2-b1)/x1*x; 
        x=(x%(a2/x1)+a2/x1)%(a2/x1);
        b1=a1*x+b1;//更改对应的值
        a1=a1/x1*a2;//合并为最小公倍数
        b1=b1%a1;
    }
    return b1;
}
posted @ 2021-07-16 16:23  Evitagen  阅读(96)  评论(0编辑  收藏  举报