1.欧几里得求gcd
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
2.扩展欧几里得求解线性方程
首先根据Bezout定理,对于任意的a,b:ax+by=gcd(a,b);
然后根据欧几里得求gcd的方法构成等价方程,在递归的同时求出x,y;
void exgcd(int a,int b,int &x,int &y)
{
if(b==0){
x=1;y=0;
return;
}
gcd(b,a%b,y,x);
y-=a/b*x;
}
另外一种写法:(不只是long long 的事情)
void exgcd(long long a,long long b,long long& x,long long& y)
{
if(!b){
x=1;y=0;
return;
}
exgcd(b,a%b,x,y);
long long tmp=x; x=y; y=tmp-a/b*y;
}