题解: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
posted @ 2026-02-24 21:52  团爸讲算法  阅读(1)  评论(0)    收藏  举报