exgcd
扩展欧几里得算法 (exgcd)
求整数 x,y 使得 ax+by=gcd(a,b)。
已知 bx′+(amodb)y′=gcd(b,amodb),而 amodb=a−⌊a/b⌋b,代入得:
bx′+(a−⌊a/b⌋b)y′=ay′+b(x′−⌊a/b⌋y′)
因此原方程的解为:
x=y′,y=x′−⌊a/b⌋y′
边界:当 b=0 时,gcd(a,0)=a,取 x=1,y=0。
流程:
- 若 b=0,返回 (x=1,y=0)。
- 否则递归求解 bx′+(amodb)y′=gcd(b,amodb)。
- 根据递推式更新 x=y′, y=x′−⌊a/b⌋y′。
得到一组整数解(可能为负)。
C++
void exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return;
}
exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
}
可以用来求逆元(ax≡1(modm) → ax+my=1,取 xmodm)、解线性同余方程。
中国剩余定理
P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪。
模数两两互质。
⎩⎨⎧x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)
设 M=m1m2⋯mn,Mi=miM,ti=Mi−1。
我们构造:
x=i=1∑naiMiti
充分性
我们发现对于每一个 i,只有在对应的那一位 aiMitimodmi 才不为 0,而且在 i 的时候答案为 ai。
唯一性
我们需要证明 M 以内没有其他解。
反证法,设 y 也是一个解。
一定有:
x−y≡0(modai)M∣(x−y)
所以 M 以内只有一个解。
P4777 【模板】扩展中国剩余定理(EXCRT)
P4777 【模板】扩展中国剩余定理(EXCRT)。
我们发现 a 不再互质了,于是需要换一种思路。我们考虑两两合并。
{x≡r1(modm1)x≡r2(modm2)
x=k1m1+r1=k2m2+r2k1m1−k2m2=r2−r1
我们发现这个可以用 exgcd 求出来。
有解条件:d=gcd(m1,m2):
k1p1−k2p2=dr2−r1
需要 d∣(r2−r1)。
用 exgcd 求:
λ1p1+λ2p2=1
k1=dr2−r1⋅λ1,k2=−dr2−r1⋅λ2
x∗=r1+k1m1=r1+dr2−r1λ1m1(modlcm(m1,m2))
错排问题
错排问题 di=(i−1)∗(di−1+di−2)。