题目背景

裴蜀定理:
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数aaa、bbb和它们的最大公约数ddd,关于未知数xxx和yyy的线性不定方程(称为裴蜀等式):若aaa,bbb是整数,且gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,那么对于任意的整数xxx,yyy,ax+byax+byax+by都一定是ddd的倍数,特别地,一定存在整数xxx,yyy,使ax+by=dax+by=dax+by=d成立

裴蜀定理证明:

现要求用扩展欧几里得方法,对每两个正整数a,b


思路


模板代码

//题目背景:AcWing 877
#include<iostream>
using namespace std;
void exgcd(int a,int b,int &x,int &y)  //扩展欧几里得算法
{if(!b)  //递归边界,b为0了{x=1,y=0;  //这个时候最大公约数是a,很容易想到x=1,y=0这个组合return;   //一定要记得return掉,这时候递归终结了}exgcd(b,a%b,x,y); //没到边界,继续往下递归int t=x;     //接用下层递归的结果,根据上面的推导,更新下当前层的最新x,y值x=y;y=t-a/b*y;
}
int main()
{int n,a,b,x,y;scanf("%d",&n);while(n--){scanf("%d%d",&a,&b);exgcd(a,b,x,y);printf("%d %d\n",x,y);}return 0;
}
}

应用:求解线性同余方程



为什么最后的结果要%m\%m%m?
题目中要求“输出答案必须在int范围之内”,而算到的x可能会溢出,根据(a×x)%m=(a×(x%m))%m(a\times x) \% m = (a \times (x \% m)) \% m(a×x)%m=(a×(x%m))%m,所以保险起见输出为x%mx \% mx%m

#include<iostream>
using namespace std;
typedef long long LL;
int exgcd(int a,int b,int &x,int &y)  //扩展欧几里得算法
{if(!b){x=1,y=0;return a;}int ans=exgcd(b,a%b,x,y);int t=x;x=y;y=t-a/b*y;return ans;
}
int main()
{int n,a,b,m,x,y;scanf("%d",&n);while(n--){scanf("%d%d%d",&a,&b,&m);int ans=exgcd(a,m,x,y);if(b%ans!=0) puts("impossible");   //如果b不能整除a和m的最大公因数,那么不存在else printf("%ld\n",(LL)x*b/ans%m);}              //这里用(LL)是为了防止x*b的中间结果溢出了return 0;      //这里%m是为了使结果留在int范围内,具体原因在上面
}

扩展欧几里得算法 思想及模板代码相关推荐

  1. 欧几里得与扩展欧几里得算法(含推导过程及代码)

    文章目录 前言 一.欧几里得算法 二.扩展欧几里得算法 2.1.认识裴蜀定理 2.2.推导ax+by=gcd(a, b)得到x与y 2.2.1.推导过程 2.2.2.代码实现 2.3.推导ax+by= ...

  2. 数论:欧几里得与扩展欧几里得算法

    文章目录 欧几里得算法 历史发展 表示 证明 代码 例题 扩展欧几里得算法 表示 求解方法 代码 其他定理: 例题 欧几里得算法 历史发展 欧几里得算法用来求得两个数的最大公约数,大约公元前300年首 ...

  3. HDU1573 X问题【扩展欧几里得算法】

    X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  4. 扩展欧几里得算法证明及代码

    裴蜀定理: 存在两个正整数a,b,使得a * x + b * y = gcd( a , b ) 证明方法(扩展欧几里得算法): 1.当 b = 0 时gac( a , b ) = a易知 x = 1, ...

  5. 扩展欧几里得算法、ax+by=c求解、ax≡c(mod m)、逆元求解、(b/a)%m计算c++代码

    参考 <算法笔记>(胡凡) 扩展欧几里得算法 求解ax+ by = gcd(a, b) int exGcd(int a, int b, int &x, int &y) {i ...

  6. 欧几里得算法扩展欧几里得算法

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

  7. 欧几里得算法和扩展欧几里得算法详解

    欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...

  8. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解

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

  9. 欧几里得与扩展欧几里得算法

    原博客:https://www.cnblogs.com/haveyoueverbeen/p/4612753.html 关于扩展欧几里得算法(Extended Euclidean Algorithm), ...

  10. 数学知识——扩展欧几里得算法

    一. 算法描述 欧几里得算法 我们先回忆一下欧几里得算法(辗转相除法): 这个很好证明: 首先,,. 1.现假设,那么,取,这样,所以a和b的约数是b和a mod b的约数. 2.现假设,那么,取,这 ...

最新文章

  1. Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function解决方法
  2. 还是两个数的交换问题
  3. python hacklib_【入门】angr:基于python的二进制分析框架
  4. iphone导出照片到电脑_iPhone里的照片如何快速导入电脑
  5. Object-c基础(2)
  6. 最后2天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!
  7. 南方CASS11.0.0.8下载安装教程附视频(日更)
  8. Web入门-namp的下载与使用
  9. PPT 插入表格出现格式如何清除
  10. 小程序审核规则大致内容
  11. 电子计算机断层扫描简称,计算机断层扫描技术(简称PET)
  12. 教程 - 【超详细】从零开始部署网站——阿里云主机CentOS系统
  13. win10专业版和企业版的区别
  14. 华为十年,总结出的12条经验!(作者是一级部门总监,华为副总裁)
  15. python高维数据降维_高维数据降维——主成分分析
  16. SQLServer锁表
  17. 奥比中光深度摄像头_奥比中光展示智能深度3D摄像头技术解决方案
  18. js中的_poto_和prototype的问题
  19. 【Qt5 for VS】关于出现 Qt platform plugin windows 运行错误的解决方案
  20. edge浏览器怎么关闭广告的方法教程

热门文章

  1. 营销数字化转型行业实践
  2. coreos mysql_CoreOS 实战:在 UOS上体验CoreOS 操作全记录
  3. c语言皮尔森系数程序,【R语言编程】---根据表达量计算mRNA与lncRNA的皮尔森相关系数...
  4. 软件设计的七大原则——超详细
  5. logistic回归详解
  6. js获取移动端屏幕高度和宽度等设备尺寸
  7. MATLAB生成(对角线上元素相同的)三对角矩阵的实例
  8. dsscocx控件出错怎么办_关于解决OCX控件调用失败问题的总结
  9. 网店宝贝复制专家操作手册
  10. ACM大佬算法课程福利分享