欧几里得与扩展欧几里得算法
欧几里得
它是我们求解整数
前置知识
过程
不妨设
我们发现如果
设
此时显然有
由右边式子可知
反过来也需证明,设
既然两式的公约数相同,则两式的最大公约数也一定相同。
所以得到式子
注:根据以上说明,可知两个数的最大公约数的约数一定包含两个数的公约数。
代码
int gcd(int a, int b) {
while (b != 0) {
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
多个数的最大公约数
显然答案是每个数的约数,那么也一定等于每相邻两个数的约数,那么我们每次取出两个数求出它们的最大公约数,再放回去,然后删除这两个数,此时这个公约数就包含了两个数的所有约数。 直至剩下的数的个数为
最小公倍数
两个数
根据算术基本定理,设
我们发现两者的最大公因数为:
最小公倍数为:
由于
所以得到的结论为
根据结论,先求出两数的最大公因数,再求出两数的最小公倍数即可。
多个数
对于一个数列
则
当
反之有
所以最终结果均满足是最大值,故得证。
方法二:
将
故得证。
代码如下:
int gcd(int a,int b)
{
if(!b)return a;
return gcd(b,a%b);
}
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int m=a[1];
for(int i=2;i<=n;i++)
m=m*a[i]/gcd(m,a[i]);
裴蜀定理
对于任意正
整数
感性理解一下,我们发现因为
那么感性理解完毕,我们开始证明。
设
两边去掉
故得证。
扩展欧几里得
它是一般我们求解形如
根据裴蜀定理,我们可以很轻松地知道
设
由欧几里得定理可知
所以
又因为
所以上式化为:
所以:
假设我们已经先求出了
所以求解这种问题就可以转化成求解最大公约数的过程了。
注:边界情况当
则原式化为:
代码
int Exgcd(int a, int b, int &x, int &y) {
if (!b) {
x = 1;
y = 0;
return a;
}
int d = Exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - (a / b) * y;
return d;
}
例题:青蛙的约会
显然,青蛙
将上式化为一般方程为:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int exgcd(int a,int b,LL &x,LL &y){
if(b==0){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
int a,b,m,n,l,f;
//cin>>f;
//while(f--){
cin>>a>>b>>m>>n>>l;
LL x=0,y=0;
int d=exgcd(m-n,l,x,y);
if((b-a)%d!=0){
cout<<"Impossible"<<endl;
}else{
int t3=b-a;
x=x*t3/d;
y=y*t3/d;
int t=abs(l/d);
cout<<(x+t)%t<<endl;
}
//}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!