扩展欧几里得算法:AcWing 877. 扩展欧几里得算法

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int x1,y1,gcd;
    gcd=exgcd(b,a%b,x1,y1);
    x=y1,y=x1-a/b*y1;
    return gcd;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        exgcd(a,b,x,y);
        printf("%d %d\n",x,y);
    }
    return 0;
}

经过数学推理和证明,可以得出x和y是方程的一组可行解,把原来求最大公约数的模板拆开(最大公约数模板跳转),注意b=0的时候y=0只是一种可行解。其他的感觉记住就行(主要是因为不是很懂)

扩展欧几里得算法用来求方程的一组可行解(ai×xi+bi×yi=gcd(ai,bi))

有一个不理解的地方,就是

cpp 复制代码
    int x1,y1,gcd;
    gcd=exgcd(b,a%b,x1,y1);
    x=y1,y=x1-a/b*y1;
    return gcd;

这个部分x1,y1没有初始化就直接使用了,为什么这样写?

参考社区其他人的理解,原帖链接:题解

可以绕过我的这个疑问,代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
    }
    else
    {
        exgcd(b,a%b,x,y);
        int t=x;
        x=y;
        y=t-a/b*y;
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        exgcd(a,b,x,y);
        printf("%d %d\n",x,y);
    }
    return 0;
}

需要注意的是,上面两份代码函数里面有两个引用符号&,表示的是需要传回x和y的地址

使用y总提供的代码好像是最简洁的

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        exgcd(a,b,x,y);
        printf("%d %d\n",x,y);
    }
    return 0;
}
相关推荐
JasmineX-18 分钟前
数据结构——顺序表(c语言笔记)
c语言·开发语言·数据结构·笔记
KyollBM11 分钟前
【Luogu】P9809 [SHOI2006] 作业 Homework (根号算法)
算法
小六子成长记12 分钟前
【C++】:list容器全面解析(超详细)
c++·windows·list
jmxwzy16 分钟前
leetcode274.H指数
算法
IT灰猫33 分钟前
C++轻量级配置管理器升级版
开发语言·c++·设计模式·配置管理·ini解析
纪元A梦39 分钟前
贪心算法应用:信用评分分箱问题详解
java·算法·贪心算法
I'm a winner2 小时前
第五章:Python 数据结构:列表、元组与字典(一)
开发语言·数据结构·python
过河卒_zh15667662 小时前
9.13AI简报丨哈佛医学院开源AI模型,Genspark推出AI浏览器
人工智能·算法·microsoft·aigc·算法备案·生成合成类算法备案
D.....l2 小时前
冒泡排序与选择排序以及单链表与双链表
数据结构·算法·排序算法
欧阳天风2 小时前
链表运用到响应式中
javascript·数据结构·链表