数学知识

exgcd(拓展欧几里得算法)

exgcd,常用于解决形如 \(ax+by=gcd(a,b)\) 的方程。
容易知道,\(gcd(a,b)=gcd(b,a%b)\)
所以我们可以先解出来方程 \(bx+(a%b)y=gcd(b,a%b)\)
所以这个方程如何解呢?
考虑参考辗转相除法,一路向下,最终一定出现 \(b=0\) 的情况,此时一定会出现 \(a=gcd(a,b)\),然后即可带入 \(x=1,y=0\)
于是接下来需要解决的问题就变成了通过方程 \(bx+(a%b)y=gcd(b,a%b)\) 的特解,推出方程 \(ax+by=gcd(a,b)\) 的一组特解。
换一种表现方式,原方程即可代换为 \(bx+(a-b*⌈\frac{a}{b}⌉)y=gcd(a,b)\)
也就是说,我们可以得到方程 \(ay+b(x-⌈\frac{a}{b}⌉y)=gcd(a,b)\) 记这个方程的一组特殊解为 \(x',y'\)
于是,原方程中 \(x\)\(y\) 的一组特殊解是 \(x=y',y=x'-y'\times ⌊\frac{a}{b}⌋\)
这样,我们就得到了原方程的一组特殊解。
但是,容易发现,大部分的题目都要求我们给出最小正整数解,所以我们又发现了这一性质。\(x+\frac{a}{gcd(a,b)},y-\frac{b}{gcd(a,b)}\)也是这个方程的一组特殊解,那么,我们只需要将 \(x\) 对着 \(\frac{a}{gcd(a,b)}\) 取模,搞成正的即可。

学会啦

例题

P1082 同余方程

[题目传送门]([P1082 NOIP 2012 提高组] 同余方程 - 洛谷)

这是个板子题。

要求的是方程 \(ax\equiv 1\mod b\) 的最小正整数解,那么这个式子显然可以转换为 \(ax+by=1\),因为保证有解,所以显然这两个数是互质的,所以我们直接 exgcd 做一做就差不多了。

P5656 【模板】二元一次不定方程

[题目传送门](P5656 【模板】二元一次不定方程 (exgcd) - 洛谷)

其实这才是真正的板子。

要求的方程是显然的,形式非常符合,所以考虑直接做。

判无解是好判断的,直接看 \(c=k\gcd(a,b),k\in Z\) 是否成立即可,如果不成立,直接输出 \(-1\) 就行了。

如果有解的话,我们考虑先做 \(ax+by=\gcd(a,b)\) ,然后将求出来的答案乘 \(k\) 即可。

然后,剩下的判断和之前的题目是一样的,就不细讲了。

需要注意到一点是,取模完了有可能那个数是 \(0\),这个时候重新给他加一下即可。

posted @ 2025-09-28 21:54  wjx_2010  阅读(7)  评论(0)    收藏  举报

欢迎来到wjxland