题解:AcWing 877 扩展欧几里得算法
【题目来源】
AcWing:877. 扩展欧几里得算法 - AcWing题库
【题目描述】
给定 \(n\) 对正整数 \(a_i,b_i\),对于每对数,求出一组 \(x_i,y_i\),使其满足 \(a_i\times x_i + b_i\times y_i = gcd(a_i,b_i)\)。
【输入】
第一行包含整数 \(n\)。
接下来 \(n\) 行,每行包含两个整数 \(a_i,b_i\)。
【输出】
输出共 \(n\) 行,对于每组 \(a_i,b_i\),求出一组满足条件的 \(x_i,y_i\),每组结果占一行。
本题答案不唯一,输出任意满足条件的 \(x_i,y_i\) 均可。
【输入样例】
2
4 6
8 18
【输出样例】
-1 1
-2 1
【算法标签】
《AcWing 877 扩展欧几里得算法》 #数学问题# #扩展欧几里得算法# #裴蜀定理#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
// 扩展欧几里得算法,用于求解 ax + by = gcd(a, b) 的一组整数解
int exgcd(int a, int b, int &x, int &y)
{
if (b == 0) { // 如果 b 为 0,递归终止
x = 1, y = 0; // 解为 x = 1, y = 0
return a; // 返回 gcd(a, b)
}
int r = exgcd(b, a % b, x, y); // 递归求解
int x1 = x, y1 = y; // 保存递归结果
// 更新 x 和 y 的值
x = y1;
y = x1 - (a / b) * y1;
return r; // 返回 gcd(a, b)
}
int main()
{
int n; // 定义整数 n,表示查询的次数
cin >> n; // 输入查询的次数
while (n--) { // 遍历每个查询
int a, b; // 定义整数 a 和 b
cin >> a >> b; // 输入 a 和 b
int x, y; // 定义变量 x 和 y,用于存储扩展欧几里得算法的解
exgcd(a, b, x, y); // 调用扩展欧几里得算法求解
cout << x << " " << y << endl; // 输出解 x 和 y
}
return 0; // 程序结束
}
【运行结果】
2
4 6
-1 1
8 18
-2 1
浙公网安备 33010602011771号