/*
函数名:gcdex
返回值: a,b的最大公约数
功能:求出a,b最大公约数,并且解出方程 a*u+b*v = gcd(a,b) u,v的值
例子:
24 36
它们的公约数为12
12 = 24*(-1)+36*(1)
*/
/*
程序的算法依据:
a%b = a-(a/b)*b
这个公式可以用矩阵表示出来
| 0 1 | | a | | b | | m[i] |
| 1 a/b | | b | = | a%b | = | n[i] |
递推即可得出
| 0 1 | …………| 0 1 | | 0 1 | | a | | b | | m[i] |
| 1 m[i]/n[i] | …………| 1 m[2]/n[2] | | 1 m[1]/n[1] | | b | = | a%b | = | 0 |
求出一下表达式第一行的两个元素的值,即是u,v
| 0 1 | …………| 0 1 | | 0 1 |
| 1 m[i]/n[i] | …………| 1 m[2]/n[2] | | 1 m[1]/n[1] |
*/
int gcdex(int a,int b,int &u,int &v)
{
/*
构造的矩阵如图
| u v |
|temu temv|
*/
int temp,temu=1,temv=-(a/b),p,q;
u=0;
v=1;
while (1)
{
temp = b;
b = a%b;
a = temp;
if(b == 0)
break;
p=u;q=v;
u = temu;v = temv;
temu = p+(-a/b)*temu;
temv = q+(-a/b)*temv;
}
return a;
}
int main()
{
int a,b,tmp;
int u,v;
while(scanf("%d%d",&a,&b)!=EOF)
{
tmp=gcdex(a,b,u,v);
printf("gcd is : %d = %d * (%d) + %d * (%d) /n",tmp,a,u,b,v);
}
return 0;
}