成仙之路−> 算法基础课题解
扩展欧几里得算法
存在 x,y 使得 ax+by=gcd
当 b=0 时,ax+by=a,易得 x=1,y=任何数
当 b\ne0 时,
因为ax+by=\gcd(a,b)=\gcd(b,a \bmod b)
而bx’+(a \bmod b)y’=\gcd(b,a \bmod b)
bx’+(a-\left\lfloor\dfrac{a}{b}\right\rfloor b)y’=\gcd(a,b)
ay’+b(x’-\left\lfloor\dfrac{a}{b}\right\rfloor y’)=ax+by
将 x’ 和 y’ 位置互换
ax’+b(y’-\left\lfloor\dfrac{a}{b}\right\rfloor x’)=ax+by
故
x=x’,y=y’-\left\lfloor\dfrac{a}{b}\right\rfloor x’
可参考: 欧几里得算法
完整代码
#include <bits/stdc++.h>
using namespace std;
int exgcd(int a, int b, int &x, int &y) {
//b == 0
if (!b) {
x = 1, y = 0;
return a;
}
//b != 0
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main() {
int n;
cin >> n;
int a, b, x, y;
while (n--) {
cin >> a >> b;
exgcd(a, b, x, y);
cout << x << ' ' << y << endl;
}
return 0;
}
请问为什么当 b=0 时,ax+by=a?
还要x=1
哦