转载请注明出处:忆梦http://blog.csdn.net/yimeng2013/article/details/11822563
题目大意:给两个数a和b,找出一组x,y使得a*x + b*y = 1,如果找不出输出sorry
题解:显然是用扩展欧几里得定理求解。
又扩展欧几里得定理有,如果a*x+b*y = d 要使得方程有解必有gcd(a,b)为d的约数。
而此题的d = 1 所以若gcd(a,b)!=1,则应该输出sorry
注意,输出的x应为最小的非负整数,这就需要用到x,y所有解的公式:
x,y所有解:
假设d=gcd(a,b). 那么x=x0+b/d*t; y=y0-a/d*t;其中t为任意常整数
假设d=gcd(a,b). 那么x=x0+b/d*t; y=y0-a/d*t;其中t为任意常整数
#include<cstdio>
int x, y;
int gcd(int a,int b)
{// x,y用全局变量保存
int t,d;
if(b==0)
{
x=1;
y=0;
return a;
}
d=gcd(b,a%b);
t=x;
x=y;
y=t-(a/b)*y;
return d;
}
int main ()
{
int a, b;
while(~scanf("%d %d", &a, &b))
{
int d = gcd(a, b);
if(d != 1)
{
printf("sorry\n");
continue;
}
while(x <= 0)
{
x = x + b;
y = y - a;
}
printf("%d %d\n",x, y);
}
return 0;
}