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

题目:(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;
}
相关推荐
齐生12 天前
iOS 知识点 - 渲染机制、动画、卡顿小集合
笔记
CoovallyAIHub2 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
木心月转码ing2 天前
Hot100-Day14-T33搜索旋转排序数组
算法
会员源码网2 天前
内存泄漏(如未关闭流、缓存无限增长)
算法
用户962377954482 天前
VulnHub DC-1 靶机渗透测试笔记
笔记·测试
颜酱2 天前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
颜酱2 天前
从0到1实现LRU缓存:思路拆解+代码落地
javascript·后端·算法
CoovallyAIHub3 天前
Moonshine:比 Whisper 快 100 倍的端侧语音识别神器,Star 6.6K!
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
速度暴涨10倍、成本暴降6倍!Mercury 2用扩散取代自回归,重新定义LLM推理速度
深度学习·算法·计算机视觉