扩展欧几里得算法 思想及模板代码
题目背景
裴蜀定理:
裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数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范围内,具体原因在上面
}
扩展欧几里得算法 思想及模板代码相关推荐
- 欧几里得与扩展欧几里得算法(含推导过程及代码)
文章目录 前言 一.欧几里得算法 二.扩展欧几里得算法 2.1.认识裴蜀定理 2.2.推导ax+by=gcd(a, b)得到x与y 2.2.1.推导过程 2.2.2.代码实现 2.3.推导ax+by= ...
- 数论:欧几里得与扩展欧几里得算法
文章目录 欧几里得算法 历史发展 表示 证明 代码 例题 扩展欧几里得算法 表示 求解方法 代码 其他定理: 例题 欧几里得算法 历史发展 欧几里得算法用来求得两个数的最大公约数,大约公元前300年首 ...
- HDU1573 X问题【扩展欧几里得算法】
X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...
- 扩展欧几里得算法证明及代码
裴蜀定理: 存在两个正整数a,b,使得a * x + b * y = gcd( a , b ) 证明方法(扩展欧几里得算法): 1.当 b = 0 时gac( a , b ) = a易知 x = 1, ...
- 扩展欧几里得算法、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 ...
- 欧几里得算法扩展欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...
- 欧几里得算法和扩展欧几里得算法详解
欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...
- c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
欧几里德算法: 复习:求最大公约数算法(欧几里得算法.也叫辗转相除法).欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd ...
- 欧几里得与扩展欧几里得算法
原博客:https://www.cnblogs.com/haveyoueverbeen/p/4612753.html 关于扩展欧几里得算法(Extended Euclidean Algorithm), ...
- 数学知识——扩展欧几里得算法
一. 算法描述 欧几里得算法 我们先回忆一下欧几里得算法(辗转相除法): 这个很好证明: 首先,,. 1.现假设,那么,取,这样,所以a和b的约数是b和a mod b的约数. 2.现假设,那么,取,这 ...
最新文章
- Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function解决方法
- 还是两个数的交换问题
- python hacklib_【入门】angr:基于python的二进制分析框架
- iphone导出照片到电脑_iPhone里的照片如何快速导入电脑
- Object-c基础(2)
- 最后2天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!
- 南方CASS11.0.0.8下载安装教程附视频(日更)
- Web入门-namp的下载与使用
- PPT 插入表格出现格式如何清除
- 小程序审核规则大致内容
- 电子计算机断层扫描简称,计算机断层扫描技术(简称PET)
- 教程 - 【超详细】从零开始部署网站——阿里云主机CentOS系统
- win10专业版和企业版的区别
- 华为十年,总结出的12条经验!(作者是一级部门总监,华为副总裁)
- python高维数据降维_高维数据降维——主成分分析
- SQLServer锁表
- 奥比中光深度摄像头_奥比中光展示智能深度3D摄像头技术解决方案
- js中的_poto_和prototype的问题
- 【Qt5 for VS】关于出现 Qt platform plugin windows 运行错误的解决方案
- edge浏览器怎么关闭广告的方法教程