求解同餘方程組:
①中國剩餘定理
當互質時,可用中國剩餘定理解。
設爲的最小公倍數(LCM),由於各項互質,則有
對於每一個同餘方程,設一個,爲同餘方程 的最小非負整數解。
則可解得同餘方程組:
- 特解:
- 通解:
- 最小非負整數解:
模板:
void exgcd(LL a,LL b,LL &d,LL &x,LL &y) //拓展歐幾里得 解單個同餘方程
{
if(b==0)
{
x=1;
y=0;
d=a;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
LL r[maxn],m[maxn];
LL CRT()
{
LL M=1,res=0;
for(int i=1;i<=n;i++)
M*=m[i]; //最小公倍數LCM
LL a,b,d,x,y;
for(int i=1;i<=n;i++)
{
a=M/m[i],b=m[i];
exgcd(a,b,d,x,y); //解同餘方程:M/m[i] * t ≡ 1 (mod m[i])
//由於M/m[i]和m[i]互質,gcd恰爲 1,所以一定有解
x=(x%b+b)%b; //最小非負整數解
res=(res+r[i]*(M/m[i])*x)%M; //加到特解當中
}
return res;
}
②拓展中國剩餘定理
當不一定互質時,需用拓展中國剩餘定理解。
設 爲(即前個)的 最小公倍數(LCM),前個方程組的一個特解爲。
對於 第個同餘方程,設一個,爲同餘方程 的最小非負整數解。
則有。
遞推可解得同餘方程組:
- 特解:
- 通解:
- 最小非負整數解:
模板:
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(b==0)
{
x=1;
y=0;
d=a;
}
else
{
exgcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
LL r[maxn],m[maxn];
LL EXCRT()
{
LL M=m[1],res=r[1];
LL a,b,c,d,x,y,t;
for(int i=2;i<=n;i++)
{ //c轉爲正
a=M,b=m[i],c=((r[i]-res)%m[i]+m[i])%m[i];
exgcd(a,b,d,x,y); //求解同餘方程:t*M ≡ r[i]-x (mod m[i])
if(c%d!=0)
return -1; //無解
t=b/d;
x=x*c/d;
x=(x%t+t)%t;
res+=x*M; //更新x
M*=t; //更新LCM:M = M*m[i]/gcd(M,m[i])
res=(res%M+M)%M;
}
return res;
}