欧几里德算法又称辗转相除法,主要求解两个数字a,b的最大公约数,该算法的原理:gcd(a,b)=gcd(b,a%b),在log级数的时间内,就能求出a,b最大公约数,使用递归函数即可(使用递归不会爆栈)
int gcd(int a,int b)
{
if(!b)
return a;
return gcd(b,a%b);
}
a*x+b*y=gcd(a,b)一定会有一个点(xo,yo)使得该方程成立
因为: gcd(a,b)=a*x0+b*y0
即: gcd(b,a%b)=b*x1+(a%b)*y1
又因为:gcd(a,b)=gcd(b,a%b)
所以: a*x0+b*y0=b*x1+(a%b)*y1
a%b=a-(a/b)*b (a/b向下取整)
即: a*x0+b*y0=b*x1+(a-(a/b)*b)*y1=a*y1+b*(x1-(a/b)*y1)
因此:x0=y1,y0=x1-(a/b)*y1
到最后:gcd(a,0)=a*x0+b*y0=a,所以x0=1,y0可以是任意值
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;//也可以是任意值
return a;
}
int x1,y1;
int ans=exgcd(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
return ans;
}