扩欧(exgcd)学习笔记
前置知识
\(\gcd\)
-
\(\gcd(a,b)=\gcd(b,a\bmod b)\)。
-
\(\bmod\) 的含义:\(a\bmod b=a-\lfloor \dfrac{a}{b} \rfloor b\)。
裴蜀定理
当方程 \(ax+by=c\) 有解时,\(\gcd(a,b)\mid c\)。
exgcd(扩欧)
求如下方程的解:
\[ax+by=c
\]
- 若 \(\gcd(a,b)\not \ \mid c\),无解。
- 否则,求出 \(ax+by=\gcd(a,b)\),乘以 \(\frac{c}{\gcd(a,b)}\) 就是答案。
所以问题转化为 \(ax+by=\gcd(a,b)\) 的解。
因为有 \(\gcd(a,b)=\gcd(b,a\bmod b)\),所以两者方程的解是等价的。
即设 \(bx'+(a\bmod b)y'=ax+by\):
然后化简为 \(ay'+b(x'-\lfloor \dfrac{a}{b} \rfloor y')\)。
void exgcd(int a,int b,int &x,int &y)
{
if(!b){x=1,y=0;return;}
exgcd(b,a%b,x,y);
int nx=y,ny=x-(a/b)*y;
x=nx,y=ny;
}
通解 \(x=x_0+t\dfrac{b}{\gcd(a,b)}\),\(y=y_0-t\dfrac{a}{\gcd(a,b)}\)。
于是可以通过范围来算出解的数量。

浙公网安备 33010602011771号