一、前言

本博客适合已经学会欧几里得算法的人食用~~~

二、扩展欧几里得算法

为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a、b是整数,那么一定存在整数x、y使得$ax+by=gcd(a,b)$。

通俗的说就是:如果$ax+by=c$有解,那么$c\%gcd(a,b)=0$

扩展欧几里得算法就是来求解$ax+by=c$这个方程的(判断有无解仅需使用欧几里得算法即可)。

我们不妨从递归到底的情况来入手。

当$b==0$时,显然有:

$\begin{cases}x=1\\y=0\end{cases}$

为一组合法解

问题是如何解决不是递归最底层的情况。

考虑往下递归时候的操作,不妨设本层的$a$为$a_1$,$b$为$b_1$下一层的$a$为$a_2$,$b$为$b_2$

结合gcd的递归过程,显然有$a_2=b_1,b_2=a_1\%b_1$

由于递归算法总是先get到下层的解,因此我们可以直接设$a_2x_2+b_2y_2=gcd(a_2,b_2)$的解为$x_2,y_2$

然后我们来思考如何根据下层解得到上层的解。

考虑取余运算的性质:显然有:$a\%b=a-(\lfloor a\div b\rfloor)*b$

然后我们把这个结论套进刚刚的式子中,用$a_1$和$b_1$替换$a_2$和$b_2$,这个过程大概是这个样子的:

$a_2x_2+b_2y_2=gcd(a_2,b_2)\\=>b_1x_2+(a_1\%b_1)y_2=gcd(a_2,b_2)\\=>b_1x_2+(a_1-a_1\div b_1*b_1)y_2=gcd(a_2,b_2)\\=>b_1x_2+a_1y_2-(a_1\div b_1)b_1y_2=gcd(a_2,b_2)\\=>a_1y_2+b_1(x_2-a_1\div b_1*y_2)=gcd(a_2,b_2)$

经过以上非常基础的推算,我们可以得到$a_1,b_1,x_1,y_1,x_2,y_2$如下的关系:

$\begin{cases}x_1=y_2\\y_1=x_2-a_1\div b_1*y_2\end{cases}$

于是递归计算即可。

exgcd的代码实现大概长这样:

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

exgcd代码实现

三、例题分析

洛谷P1082同余方程

这道题开门见山,直接就说出了要求什么,可谓NOIP茫茫毒瘤题中一股清流

我们要求的是$ax≡1 (mod b)$,不妨设$ax+by=1$,接下来我们就可以搬出我们的exgcd的模板,轻松秒掉这道题。

值得注意的是,我们求出来的是最小解,而题目要求的是最小正整数解,因此如果不符合条件的话还要往上累加。

 #include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int x,y,a,b;
void exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=;y=;
return;
}
exgcd(b,a%b,x,y);
int x1=x,y1=y;
x=y1;y=x1-a/b*y1;
}
signed main()
{
cin>>a>>b;
exgcd(a,b,x,y);
while(x<)x=(x+b)%b;
cout<<x<<endl;
return ;
}

洛谷P1082同余方程

(贝祖定理内容部分来自这位大佬的博客)

扩展欧几里得算法详解(exgcd)的更多相关文章

  1. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  2. 详解扩展欧几里得算法(扩展GCD)

    浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...

  3. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  4. gcd(欧几里得算法)与exgcd(扩展欧几里得算法)

    欧几里得算法: 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b)  =>  a=m*d,b=n ...

  5. 扩展欧几里得算法(EXGCD)学习笔记

    0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...

  6. 模板——扩展欧几里得算法(求ax+by=gcd的解)

    Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...

  7. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元

    有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...

随机推荐

  1. 扩展微信小程序 Page 构造函数,修改生命周期函数

    不BB,直接正题 一. 将公共方法绑定到Page上 单个绑定 const oldPage = Page Page = function(app) { // 注意公共函数的名字不要重复,否则覆盖 app ...

  2. 【LuoguP3241】[HNOI2015] 开店

    题目链接 题意 给出一棵边带权的树,多次在线询问一个点到一个区间内的点的距离和. Sol 分块过不了的 一个 trick ,都知道要算两点之间距离可以拆成到根的距离和他们的 LCA 到根的距离 ,其实 ...

  3. Python---进阶---logging---装饰器打印日志2

    ### logging - logging.debug - logging.info - logging.warning - logging.error - logging.critical ---- ...

  4. 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\......”--“拒绝访问。 ”错误

    1.通常的解决方法:原因是由于系统目录下的Temp目录无相应的权限所致,具体操作如下: C:\Windows\temp-->属性-->安全-->编辑-->添加NETWORK S ...

  5. 【leetcode】1171. Remove Zero Sum Consecutive Nodes from Linked List

    题目如下: Given the head of a linked list, we repeatedly delete consecutive sequences of nodes that sum ...

  6. HTML和CSS遇到的细节问题

    一.列表项标记窜出div盒子 列表项标记窜出盒子,是因为设置了 *; } ,消除了<li>元素的默认外边距. 结解决方法:消除*{}选择器或是设置外边距 列表项目标记与边距有关 二.div ...

  7. IDEA将新建项目上传至GitLab

    1.首先,需要你自己登录GitLab,并新建一个项目的链接,如下图所示: (此图为图三,该链接下面操作中将会用到!) 2.在idea上新建一个项目,完成之后,需要创建一个git仓库: 3.然后可以根据 ...

  8. 放一道比较基础的LCA 的题目把 :CODEVS 2370 小机房的树

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  9. k8s登录harbor报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cance

    [root@k8s-node02 ~]# docker login 192.168.180.105:1180 Username: admin Password: Error response from ...

  10. (24)Python实现递归生成或者删除一个文件目录及文件

    def removeDir(dirPath): ''' Created by Wu Yongcong 2017-8-18 :param dirPath: :return: ''' if not os. ...