扩展欧几里得算法
前置条件:需要掌握裴蜀定理和欧几里得算法
裴蜀定理:
对于不全为0的整数a, b,一定有整数x, y,使得ax + by = gcd(a, b)
欧几里得算法:
gcd(a, b) == gcd(b, a % b)
假设有组特解x0, y0,使得ax0 + by0 = gcd(a, b)
则必有bx1 + (a % b)y1 = gcd(b, a % b) = gcd(a, b)
其中(a % b) = a - a / b * b
整理得:b(x1 - a / b * y1) + ay1 = ax0 + by0
即:y0 = x1 - a / b * y1, x0 = y1
所以x0 是由 y1转化而来, y0 是由 x1 - a / b * y1转化而来,因此递归时使用exgcd(b, a % b, y, x), y -= a / b * x
若要使ax + by = n(n为ax + by可以取到的数)
设d = gcd(a, b), 那么n % d == 0,n一定是d的倍数
他的特解是x0, y0,而通解则是:
x = n / d * x0 + k * b / d(k为任意整数)
y = n / d * y0 + k * a / d
#include <iostream>
using namespace std;
int exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main() {
int n;
cin >> n;
while (n --) {
int a, b, x, y;
cin >> a >> b;
exgcd(a, b, x, y);
cout << x << ' ' << y << endl;
}
return 0;
}
标签:gcd,int,欧几里得,扩展,exgcd,算法,y1,y0,x0
From: https://www.cnblogs.com/lbzbk/p/17380125.html