GCD(欧几里得算法)
#include<cstdio>
#include<iostream>
using namespace std;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int x,y;
cin>>x>>y;
cout<<gcd(x,y)<<endl;
return 0;
}
扩展欧几里得算法:
常见写法1:
int extgcd(int a,int b,int&x,int&y)
{
if(b==0){
x=1,y=0;return a;
}
int d=extgcd(b,a%b,x,y);
int z=x;x=y;y=z-y*(a/b);
return d;
}
常见写法2:
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;
}
else{
x=1,y=0;
}
return d;
}
注意x,y要用传引用,并且不用初始化,因为他是在b=0的时候将x,y赋值为1和0,并在回溯的时候逐步更改。
最后返回值就是最大公约数,x,y就是一组解。
附加结论:
1.对于任意整数a,b,存在一对整数x,y,满足ax+by=gcd(a,b);
2.对于方程ax+by=c,有整数解当且仅当d|c(d为最大公约数);
求解时先求出=d的解,然后乘上c/d即可。