欧几里得算法的拓展主要是用于求解   :

    已知整数 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欧几里得的拓展算法的更多相关文章

  1. ACM数论-欧几里得与拓展欧几里得

    ACM数论——欧几里得与拓展欧几里得 欧几里得算法: 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd ...

  2. gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)

    gcd(欧几里得算法辗转相除法): gcd ( a , b )= d : 即 d = gcd ( a , b ) = gcd ( b , a mod b ):以此式进行递归即可. 之前一直愚蠢地以为辗 ...

  3. ACM数论-欧几里得与拓展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  4. <数论相关>欧几里得与拓展欧几里得证明及应用

    欧几里得算法 欧几里得算法的复杂度为O(log(n)),是一个非常高效的求最大公约数算法. 在这里不证明欧几里得算法的复杂度,有兴趣的可以访问以下链接:http://blog.sina.com.cn/ ...

  5. uva 10951 - Polynomial GCD(欧几里得)

    题目链接:uva 10951 - Polynomial GCD 题目大意:给出n和两个多项式,求两个多项式在全部操作均模n的情况下最大公约数是多少. 解题思路:欧几里得算法,就是为多项式这个数据类型重 ...

  6. 欧几里得 &amp; 拓展欧几里得算法 解说 (Euclid &amp; Extend- Euclid Algorithm)

    欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法.用于计算两个正整数a.b的最大公约数. -- ...

  7. NOIP2012拓展欧几里得

    拉板题,,,不说话 我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了 先来一发欧几里得拓展裸 #include <cstdio> void gcd ...

  8. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

  9. 算法马拉松35 E 数论只会Gcd - 类欧几里得 - Stern-Brocot Tree - 莫比乌斯反演

    题目传送门 传送门 这个官方题解除了讲了个结论,感觉啥都没说,不知道是因为我太菜了,还是因为它真的啥都没说. 如果 $x \geqslant y$,显然 gcd(x, y) 只会被调用一次. 否则考虑 ...

随机推荐

  1. c实现循环链表

    解决约瑟夫环问题核心步骤: 1.建立具有n个节点.无头的循环链表 2.确定第一个报数人的位置 3.不断从链表中删除链节点,直到链表为空 #include <iostream> #inclu ...

  2. Monkey测试感想

    monkey测试主要做随机的黑盒测试,通过不断输入伪随机的事件流来测试应用的稳定性,但是由于monkey太过皮,太过随机,最后根本无法控制,很容易陷于一个页面无法出来,或者陷入某个无关紧要的地方无法出 ...

  3. iTerm2 半透明颜色主题与字体配置

    下载iTerm2https://www.iterm2.com/ 安装. 下载这个主题https://raw.githubusercontent.com/mbadolato/iTerm2-Color-S ...

  4. 添加sql距离现在多久以前时间条件

    UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(add_time)<=25200 其中now()是现在时间 add_time是其他时间点  25200:是秒,现在和ad ...

  5. 重读APUE(15)-pthread_cond_wait与while循环

    即使pthead_cond_wait()和pthread_cond_timewait()没有错误返回,等待的条件也可能是假的:即使pthread_cond_timewait()返回了超时错误,关联的条 ...

  6. qt 创建及调用QT的 DLL

    先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...

  7. Flutter移动电商实战 --(31)列表页_列表切换交互制作

    点击左侧的大类右边的小类也跟着变化 新建provide 要改变哪里就建哪里的provide,我们现在要改变的是右边的商品列表的数组. category_goods_list.dart 这样我们的pro ...

  8. 全国数据json

    { "provinces": { "province": [ { "ssqid": "110000", "ss ...

  9. Vue UI组件库

    1. iView UI组件库  iView官网:https://www.iviewui.com/ 2.Vux UI组件库   Vux官网:https://vux.li/ 3.Element UI组件库 ...

  10. 阿里内部分享:我们是如何?深度定制高性能MySQL的

    阿里云资深数据库工程师赵建伟在“云栖大会上海峰会”的分享.核心是阿里云的数据库服务和MySQL分支的深度定制实践分享. 阿里巴巴MySQL在全球都是有名的.不仅是因为其性能,还因为其是全世界少数拥有M ...