算法笔记·数学·扩展欧几里得算法

题目:(AcWing)

给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含两个整数 ai,bi。

输出格式

输出共 n 行,对于每组 ai,bi,求出一组满足条件的 xi,yi,每组结果占一行。

本题答案不唯一,输出任意满足条件的 xi,yi 均可。

数据范围

1≤n≤105,

1≤ai,bi≤2×109

输入样例:
复制代码
2
4 6
8 18
输出样例:
复制代码
-1 1
-2 1

扩展欧几里得:

即求解方程ax+by=gcd(a,b) (a,b的最大公约数)的一种方法

举个简单的栗子:

令a = 5, b = 18,求x,y.

解:3 = 18 - 5*3 #1; 2 = 5 - 3 #2; 1 = 3 - 2 #3;

将式#1#2代入#3,则有1 = (18 - 5*3 )-(5 - (18 - 5*3)) = 18-5*3-5+18-5*3 = 5*(-7) + 18*2

故x = -7,y = 2;

不妨设递推的两层变量为,公约数均为c

有方程,

根据欧几里得算法

cpp 复制代码
int gcd(int a,int b)
{
    if(a%b == 0) return b;
    return gcd(b,a%b);
}

易得,

代入一式得,

对比式二系数,知,

又递推到a%b == 0时,可知除数b即为最大公约数c,0*a + 1*b = c, 即 x = 0 , y = 1。

那么可推得上一层a%b == c,则显然,所以 x = 1, y=-1,符合递推公式。

代码实现:

cpp 复制代码
#include<iostream>
using namespace std;

int exgcd(int a,int b,int& x,int &y)
{
    if(a%b == 0)//当a整除b时,b就是最大公约数
    {
        //根据公式ax+by = gcd(a,b);
        x = 0;
        y = 1;
        return b;
    }
    
    int d = exgcd(b,a%b,x,y);
    int t = x;
    x = y;
    y = t - a/b*y;
    return d;
}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int a,b,x,y;
        cin>>a>>b;
        x = y = 0;
        exgcd(a,b,x,y);
        cout <<x<<" "<<y<<endl;
    }
    return 0;
}
相关推荐
mit6.8246 小时前
bfs|栈
算法
FFF团团员9097 小时前
树莓派学习笔记3:LED和Button
笔记·学习
CoderYanger7 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
碧海潮生_CC7 小时前
【CUDA笔记】04 CUDA 归约, 原子操作,Warp 交换
笔记·cuda
jllllyuz7 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
稚辉君.MCA_P8_Java8 小时前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*8 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
摇滚侠8 小时前
2025最新 SpringCloud 教程,从单体到集群架构,笔记02
笔记·spring cloud·架构
风123456789~8 小时前
【OceanBase专栏】OB背景知识
数据库·笔记·oceanbase
.YM.Z9 小时前
【数据结构】:排序(一)
数据结构·算法·排序算法