【算法?日更?第五十六期】扩展欧几里得算法

▎裴蜀定理

  这个定理很简洁,就是关于x,y(都是整数)的不定方程在下面的情况下:

  

  必定有解。

  这只是个前置知识,就不证明了(主要是小编太菜)。

▎不定方程

  考虑方程ax+by=c的解的情况:

  • 若c=gcd(a,b),那么依照裴蜀定理有解;
  • 若c=k*gcd(a,b),先两边同除k,就会转化成标准形式,有解;
  • 若c与gcd(a,b)互质,那么无解;

  所以问题就是:

  

  如何解决,只要解决了这个问题,所有解的情况就解决了。

▎问题解决

  现在我们考虑怎么让这个问题更简单,思考这样一个问题,已知:

  

  的解(x,y),那么怎么推出:

  

  的解(x‘,y’)呢?

  先抛出结论:

  下面是证明过程:

  

  知道了这个东西之后,我们就可以在算完

  

  的时候很快推出:

  

  这样可以层层递归下去,直到y=0,那么x=1,y=0的情况下就是a+0=gcd(a,0),此条件成立,那么再回溯回去就可以了。

▎代码实现

  感觉像极了辗转相除法。

1 pair<int,int> exgcd(int a,int b)
2 {
3         if(b==0) return pair(1,0);
4         pair<int,int> sum=exgcd(b,a%b);
5         return pair<int,int>(y,x-a/b*y);
6 }

原文地址:https://www.cnblogs.com/TFLS-gzr/p/11395285.html

时间: 2025-01-07 17:20:11

【算法?日更?第五十六期】扩展欧几里得算法的相关文章

【算法?日更?第五十期】二分图(km算法)

▎前言 戳开这个链接看看,惊不惊喜,意不意外?传送门. 没想到我的博客竟然被别人据为己有了,还没办法投诉. 这年头写个博客太难了~~~ 之前小编写过了二分图的一些基础知识和匈牙利算法,今天来讲一讲km算法,若你不知道匈牙利算法,请先看下面的博客.(否则会体验极差) 传送门 ▎km算法 ?『引入』 之前学习的匈牙利算法还记得吗?它处理的是无权二分图,长这个样子: //mspaint画出来的真粗糙 但是如果加入了权值呢?比如说是这个样子的: 现在,我们的问题变了,不再求最大匹配问题了,而是最优匹配问

Android Studio 第五十六期 - Android之系统设置选项的包名

以com.android.settings开头的形式: com.android.settings.Settings 手机系统设置 com.android.settings.WirelessSettings 无线和网络设置 com.android.settings.AccessibilitySettings 辅助功能设置 com.android.settings.ActivityPicker 选择活动 com.android.settings.ApnSettings APN设置 com.andro

【算法?日更?第三十三期】网络流基础知识(最大流)

▎写在前面 小编早就听说过了网络流这种神奇的东西,一直以为很高端大气上档次,但是很难,就没学. 今日一见也不过如此,一点也不高端,不大气,不上档次. ▎网络流 ?『定义』 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与合成等新课题.网络流的应用已遍及通讯.运输.电力.工程规划.任务分派.设备更新以及计算机辅助设计等众多领域.(copy自百度) ?『介绍』 其实上面的度娘写

经典算法题每日演练——第十六题 Kruskal算法

原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0,1,2,3,4,5}这样6个节点,我们知道Prim算法构建生成树是从”顶点”这个角度来思考的,然后采用“贪心思想” 来一步步扩大化,最后形成整体最优解,而Kruskal算法有点意思,它是站在”边“这个角度在思考的,首先我有两个集合. 1. 顶点集合(vertexs): 比如M集合中的每个元素都可以认

第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

第三百五十六节,Python分布式爬虫打造搜索引擎Scrapy精讲-scrapy分布式爬虫要点 1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

[kuangbin带你飞]专题十六 KMP &amp; 扩展KMP &amp; Manacher :G - Power Strings POJ - 2406(kmp简单循环节)

[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher G - Power Strings POJ - 2406 题目: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of

扩展欧几里得算法(双六游戏)

题目大意:一个双六上面有向前 向后无限延续的格子, 每个格子都写有整数.其中0号格子是起点,1号格子是终点.而骰子上只有a,b,-a,-b四个整数,所以根据a和b的值的不同,有可能无法到达终点掷出四个整数各多少次可以到达终点呢?如果解不唯一,输出任意一组即可.如果无解 输出-1 思路:这道题用数学方法表述就是求整数x和y使得"ax+by=1",可以发现,如果gcd(a,b)不等于1,显然无解. 反之,则可以用扩展欧几里得算法来求解.  事实上,一定存在整数对(x,y)使得ax+by=g

扩展欧几里得算法------扩展欧几里德算法

扩展欧几里得算法及其应用 一.扩展欧几里得算法 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,若gcd(a,b)表示 a,b 的最大公约数,必然存在整数对x,y ,使得 ax+by = gcd(a,b). 算法过程: 设 a>b,当 b=0时,gcd(a,b)=a.此时满足ax+by = gcd(a,b)的一组整数解为x=1,y=0:当a*b!=0 时, 设 a*x1+b*y1=gcd(a,b):b*x2+(a mod b)*y2=gcd(b,a mod b): 根据欧几里得原理知 g

算法学习 之 欧几里得算法和扩展欧几里得算法(二)

关于扩展欧几里得算法(Extended Euclidean Algorithm),我是在做青蛙的约会这一经典题目才接触到这个算法的.后面也有关于这一题的AC代码和解题思路. 内容:已知a, b,求解一组x,y,使它们满足贝祖等式: ax+by =gcd(a, b) 扩展欧几里得算法,就和它的名字一样是对欧几里得算法的扩展.何为扩展?一是,该算法保留了欧几里得算法的本质,可以求a与b的最大公约数.二是,已知a, b求解二元一次方程ax+by =gcd(a, b)的一组解(x,y). 证明: 假设