您的位置:首页 > 其它

HDU 2669 Romantic (扩展欧几里得定理)

2013-09-19 00:34 246 查看


转载请注明出处:忆梦http://blog.csdn.net/yimeng2013/article/details/11822563

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2669

题目大意:给两个数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为任意常整数


#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论