扩欧(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)}\)

于是可以通过范围来算出解的数量。

posted @ 2024-12-04 21:35  _E_M_T  阅读(18)  评论(0)    收藏  举报