拓展中国剩余定理
拓展中国剩余定理
引入
我们知道中国剩余定理的约束条件:模数必须全都互质。
那么当模数不互质的情况该怎么办呢?这时候就要用到 拓展中国剩余定理
实现
形如:
\[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;
}
不关注的有难了😠😠😠https://b23.tv/hoXKV9