https://www.cnblogs.com/MashiroSky/p/5918158.html
(拼凑自以上连接)
备忘录:
a|b是指a能整除b,a是b的因式,4|2是不成立的,2|4才成立
lcm(a,b) a,b的最小公倍数
中国剩余定理
设正整数两两互素,则同余方程组
有整数解。并且在模下的解是唯一的,解为
其中,而
为
模
的逆元。
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;y=0;
return a;
}
int g=exgcd(b,a%b,x,y);
int x1 = y,y1 = x-a/b*y;
x = x1;
y = y1;
return g;
}
int inv(int m, int p){
int x, y;
int g = exgcd(m,p,x,y);
return ((x%p)+p)%p;
}
ll CRT(ll a[], ll m[], int n)
{
ll M=1;
for(ll i=0; i<n; i++) M*=m[i];
ll ans=0;
for(ll i=0; i<n; i++){
ll Mi=M/m[i];
ll x=inv(Mi,m[i]);
ans=(ans+Mi*x*a[i])%M;
}
return (ans+M)%M;
}
扩展中国剩余定理
中国剩余定理扩展——求解模数不互质情况下的线性方程组:
普通的中国剩余定理要求所有的互素,那么如果不互素呢,怎么求解同余方程组?
这种情况就采用两两合并的思想,假设要合并如下两个方程:
那么得到:
我们需要求出一个最小的x使它满足:
那么x1和x2就要尽可能的小,于是我们用扩展欧几里得算法求出x1的最小正整数解,将它代回a1+m1x1,得到x的一个特解x′,当然也是最小正整数解。
所以x的通解一定是x′加上lcm(m1,m2)∗k,这样才能保证x模m1和m2的余数是a1和a2。由此,我们把这个x′当做新的方程的余数,把lcm(m1,m2)当做新的方程的模数。(这一段是关键)
合并完成: