求出A,B的最大公约数,且求出X,Y满足AX + BY = GCD(A, B)。
要求X,Y,满足:
当 B = 0 时,有X=1,Y=0时等式成立。
当 B > 0 时,在欧几里得算法的基础上,已知:
先递归求出 X‘,Y‘ 满足:
然后可以回推,我们将上式化简得:
这里除法指整除。把含B的因式提取一个B,可得:
故 X=Y‘, Y= X‘ - A/B x Y‘。
int extend_gcd(int a, int b, int &x, int &y);
复杂度:O(logN), 其中N和a,b同阶。
输入:
输出:a和b的最大公约数
调用后x,y满足方程ax+by=GCD(a,b)。
int extend_gcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1; y = 0;
return a;
} else {
int r = extend_gcd(b, a%b, y, x);
y -= x * (a / b);
return r;
}
}
POJ1006,POJ2115。
原文:https://www.cnblogs.com/zifeiy/p/9520874.html