GCD欧几里得的拓展算法
欧几里得算法的拓展主要是用于求解 :
已知整数 a, b,然后我们进行 ax + by == gcd(a , b) 的问题求解
那么如何进行求解呢?和欧几里得算法一样, 我们需要进行递归的方式进行问题的求解, 而且涉及到 a % b 与 a / b 和 a 的关系
我们假设已经是求出了
b x' + ( a % b ) y' == gcd(a, b);
利用关系, 我们就可以进一步回溯
a y' + b (x' - a / b * y') == gcd(a, b);
但是注意, 这里面的 x, y 对应的 x' y' 似乎是颠倒了, 但是没大问题, 我们只需要在调用函数的时候进行 x, y 参数位置的颠倒就可以
附加挑战书上面双六的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <list>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
using namespace std; //这个是x , y == gcd(x, y) 的小算法哦!!!
int extgcd(int a, int b, int &x, int &y){
int d = a;
if(b != ){
d = extgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
else{
x = , y = ;
return d;
}
}
// gcd 求解最大公因数
int gcd(int a, int b){
return b == ? a : gcd(b, a % b);
} /*这个是挑战书上面双六游戏的代码*/
int main()
{
int a, b; cin>>a>>b;
int x, y;
printf("GCD : %d\n", gcd(a, b));
printf("EXTGCD : %d\n", extgcd(a, b, x, y));
if(extgcd(a, b, x, y) == ){
printf("FIRST IF : \n");
int res = (a > ? a : -a) + (b > ? b : -b);
printf("%d\n", res);
}
else{
printf("SECOND ELSE : \n");
printf("-1\n");
}
return ;
}
注意事项 :
函数调用的时候, 他有着位置的交换(x, y)
然后 y 的数值有着更新
甚至他后两个函数的参数是 引用, 直接对输入变量的元存储进行了修改, 也是避免了返回数值两个 x, 和 y 的麻烦;
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cctype>#include <algorithm>#include <string>#include <vector>#include <queue>#include <list>#include <map>#include <stack>#include <set>#include <cstdlib>using namespace std;
//这个是x , y == gcd(x, y) 的小算法哦!!!int extgcd(int a, int b, int &x, int &y){ int d = a; if(b != 0){ d = extgcd(b, a % b, y, x); y -= a / b * x; return d; } else{ x = 1, y = 0; return d; }}// gcd 求解最大公因数int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}
/*这个是挑战书上面双六游戏的代码*/int main(){ int a, b; cin>>a>>b; int x, y; printf("GCD : %d\n", gcd(a, b)); printf("EXTGCD : %d\n", extgcd(a, b, x, y)); if(extgcd(a, b, x, y) == 1){ printf("FIRST IF : \n"); int res = (a > 0 ? a : -a) + (b > 0 ? b : -b); printf("%d\n", res); } else{ printf("SECOND ELSE : \n"); printf("-1\n"); } return 0;}
GCD欧几里得的拓展算法的更多相关文章
- ACM数论-欧几里得与拓展欧几里得
ACM数论——欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd ...
- gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...
- ACM数论-欧几里得与拓展欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...
- <数论相关>欧几里得与拓展欧几里得证明及应用
欧几里得算法 欧几里得算法的复杂度为O(log(n)),是一个非常高效的求最大公约数算法. 在这里不证明欧几里得算法的复杂度,有兴趣的可以访问以下链接:http://blog.sina.com.cn/ ...
- uva 10951 - Polynomial GCD(欧几里得)
题目链接:uva 10951 - Polynomial GCD 题目大意:给出n和两个多项式,求两个多项式在全部操作均模n的情况下最大公约数是多少. 解题思路:欧几里得算法,就是为多项式这个数据类型重 ...
- 欧几里得 & 拓展欧几里得算法 解说 (Euclid & Extend- Euclid Algorithm)
欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法.用于计算两个正整数a.b的最大公约数. -- ...
- NOIP2012拓展欧几里得
拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...
- poj 1061 青蛙的约会 (扩展欧几里得模板)
青蛙的约会 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 算法马拉松35 E 数论只会Gcd - 类欧几里得 - Stern-Brocot Tree - 莫比乌斯反演
题目传送门 传送门 这个官方题解除了讲了个结论,感觉啥都没说,不知道是因为我太菜了,还是因为它真的啥都没说. 如果 $x \geqslant y$,显然 gcd(x, y) 只会被调用一次. 否则考虑 ...
随机推荐
- 下载、配置全新的eclipse
1.https://www.eclipse.org/downloads/ 2.确保安装配置了JDK,打开eclipse-inst-win64.exe,让eclipse installer程序UPDAT ...
- linux中如何修改最大文件句柄数
1.使用ulimit -a可以查看,其中的open files后面的数就是最大文件句柄数 2.临时方法:使用ulimit -n size修改最大文件句柄数(这种方法只针对当前进程有效) 3.永久方法: ...
- linux java -jar
常见命令1 nohup java -jar /xxx/xxx/xxx.jar >/dev/>& & 分析各个指令代表什么意思: >,重写文件,如果文件里面有内容会覆盖 ...
- 图论——最小生成树:Prim算法及优化、Kruskal算法,及时间复杂度比较
最小生成树: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.简单来说就是有且仅有n个点n-1条边的连通图. 而最小生成树就是最小权 ...
- CSP2019懵逼记
CSP2019 考场二日游 CJ 旅游团 本来我是准备咕掉的, 但是被强 ♂ 烈要求更博了 Day -INF ~ Day -1 专题巩固和联考 前面半个月疯狂爆炸 后面半个月状态恢复了, 考得还行 联 ...
- 【SpringBoot】整体下载大文件与分批下载大文件(利用MySql数据库的Limit实现)
在前文里谈过一次性从数据库取一个大结果集有可能导致outofMemory,当时的想法是分批去取回来,今天把它实现了,特地把代码分享出来: 工程下载:https://files.cnblogs.com/ ...
- Python: 根据利润计算奖金
简述:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%: 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%: 20万到40 ...
- 前端js保存页面为图片下载到本地
前端js保存页面为图片下载到本地 手机端点击下载按钮将页面保存成图片到本地 前端js保存页面为图片下载到本地的坑 html2canvas 识别 svg 解决方案 方案 html2canvas.js:可 ...
- C# Socket TcpClient 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。
开始的代码: byte[] data = Encoding.UTF8.GetBytes(sInfo); tcpns.Write(data, 0,1024); 修改 ...
- 003-jdk-数据结构-HashMap、HashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、Set
一.Map概述 Map:“键值”对映射的抽象接口.该映射不包括重复的键,一个键对应一个值. 1.1.HashTable[不常用] 基于“拉链法”实现的散列表. 底层数组+链表实现,无论key还是val ...