设ax1+by1=gcd(a,b), bx2+(a%b)y2=gcd(b,a%b);
由gcd(a,b)=gcd(b,a%b),可得:
ax1+by1=bx2+(a%b)y2;
即:ax1+by1=bx2+(a-(a/b)*b)y2
=ay2+bx2-(a/b)*by2;
即:ax1+by1=ay2 + b(x2-(a/b)*y2)
根据恒等定理,对应项相等,得:x1=y2; y1=x2-(a/b)*y2;
这样我们就得到了:x1,y1的值基于x2,y2,所以我们可以通过递归求解。
C++ 代码
/*
* @Author: lzyws739307453
* @Language: C++
*/
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
//写法一
void Exgcd_1(int a, int b, int &x, int &y) {
if (!b)
x = 1, y = 0;
else {
Exgcd_1(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
}
}
//写法二
void Exgcd_2(int a, int b, int &x, int &y) {
if (!b)
x = 1, y = 0;
else Exgcd_2(b, a % b, y, x), y -= a / b * x;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
int a, b, x, y;
scanf("%d%d", &a, &b);
Exgcd_2(a, b, x, y);
printf("%d %d\n", x, y);
}
return 0;
}
Exgcd_1(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;想问一下上面的代码能不能直接写成Exgcd(b, a%b, y, x-(a/b)y)啊
感谢大佬
orz
tql
tql
??为什么a % b = a - (a/b) * b。怎么变过去的?我的脑袋瓜啊转不动了😭
我也想知道
我知道了,讲解视频里有推
tql,非常感谢博主,终于看懂为什么可以交换了
耶!写的很棒!
tql
orz
看写法1终于懂了
哇 谢谢大佬