扩展欧几里得的理解与应用
原创
©著作权归作者所有:来自51CTO博客作者lzyle的原创作品,请联系作者获取转载授权,否则将追究法律责任
例题:NOIP2012同余方程 题目要求关于的同余方程的最小正整数解
题目中的等价于
只不过这里的一般为负数
根据裴蜀定理,有整数解的充要条件是
这里的为,所以也只能为,即互质
扩展欧几里得求的东西是的整数解
所以放到这里正好适用,因为就是
由辗转相除法可知
假设我们现在有一组解满足
由模法的定义可知
所以上式可以化为
所以,
这里的还需要一个来求得
这样一直递归下去,变成,变成
总会为,为时,就可以写成
很明显这里的,需要回溯进上一层递归,取任意值都可,一般回溯
NOIP2012同余方程代码,这里的exgcd是简化之后的:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) {x = 1; y = 0; return;}
exgcd(b, a % b, y, x); y -= (a / b) * x;
}
int main(int argc, char const *argv[]) {
ll a, b, x, y; cin >> a >> b;
exgcd(a, b, x, y); cout << (x + b) % b << endl;
}