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\),这个时候重新给他加一下即可。