扩展欧几里得算法
a * x + b * y = gcd(a, b)
推导过程:
a * x + b * y = d;
如果 d mod gcd(a, b) == 0,则有
a * x1 + b * y1 = d,
b * x2 + (a % b) y2 = d; // gcd(a, b) = gcd(b, a % b)
又 a % b = a - (a / b) * b;
代入上式后,联立得:
a * y2 + b * (x2 - (a / b) * y2) = d;
对照 a * x1 + b * y1 = d 即可得到:
x1 = y2
y1 = x2 - (a / b) * y2
对应代码如下:
int exgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
else {
int r = exgcd(b, a % b, x, y);
int temp = x;
x = y;
y = temp - (a / b) * y;
/*这样写也是可以的:
int r = exgcd(b, a % b, y, x);
y -= (a / b) * x;
*/
return r;
}
}