#include <iostream>
#include <cstdio>
using namespace std;
/*
扩展欧几里德算法,gcd(a,b) = a*x + b*y
利用递归求解 gcd(a,b) 的过程,顺便求出系数 x y
设:
gcd(a,b) = a*x + b*y
gcd(b,a%b) = b*x1 + (a%b)*y1
= b*x1 + (a-a/b*b)*y1
= a*y1 + b*(x1-a/b*y1)
于是有:
x = y1
y = x1 - a/b*y1
只需要在递归的过程中,解出子问题 :gcd(b,a%b) 的系数 x1 y1 就可以求出问题的 x y
*/
int ex_gcd(int a,int b,int *x,int *y)
{
if(b==0)
{
*x=1; //初始化
*y=0; //初始化
return a;
}
int ans=ex_gcd(b,a%b,x,y); //求解子问题的 gcd(b,a%b) 以及 x1 y1
int temp=*x;
*x=*y; //计算 x
*y=temp-*y*a/b; //计算 y
return ans; //计算 gcd(a,b) = gcd(b,a%b)
}
int main()
{
int a,b,x,y;
while(scanf("%d%d",&a,&b)!=EOF)
{
int ans=ex_gcd(a,b,&x,&y);
printf("gcd=%d x=%d y=%d\n",ans,x,y);
}
return 0;
}利用扩展欧几里得,我们可以求出这样的式子: c = a * x + b * y 的系数 x y
可以把这个式子写成这样:
c/gcd(a,b)*gcd(a,b) = a * x + b * y
再变形:
c/gcd(a,b) = a/gcd(a,b) * x + b/gcd(a,b) * y
如果我们得到了:
gcd(a,b) = a * x1 + b * y1
那么,我们就有了:
x = c * x1 / gcd(a,b)
y = c * y1 / gcd(a,b)
那么,问题就解决了