已知 ax + by =gcd ( a,b )
int gcd(int a,int b)
{
if(b==0) return a;
return (b,a%b);
}
求 ax + by =gcd ( a,b ) 式子中 x 与 y 的值
int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法
{
if(b==0)
{
x=1;y=0;
return a; //到达递归边界开始向上一层返回
}
int Gcd=exgcd(b,a%b,x,y);
int t=y; //把x y变成上一层的
y=x-(a/b)*y;
x=t;
return Gcd; //得到a b的最大公因数
}
原理:
b=0时 //辗转相除法的最后一层
Gcd(a,b)=a;
x=1;y=0;
b!=0时 //辗转相除法的中间层
gcd(a,b) = aX1 + bY1;
gcd(b,a%b) = bX2 + (a%b)Y2;
(a%b=a-a/b*b);
aX1 + bY1 = aY2 + b(X2-a/b*Y2);
X1 = Y2 , Y1 = X2-a/b*Y2;