您的位置:首页 > 其它

nyoj 扩展欧几里德入门

2016-05-26 15:06 190 查看
点击打开链接http://acm.nyist.net/JudgeOnline/problem.php?pid=775

百度有证明 

求解 x,y的方法的理解

设 a>b。

1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;

2,a>b>0 时

设 ax1+ by1= gcd(a,b);

bx2+ (a mod b)y2= gcd(b,a mod b);

根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);

则:ax1+ by1= bx2+
(a mod b)y2;

即:ax1+ by1= bx2+
(a - [a / b] * b)y2=ay2+ bx2-
[a / b] * by2;

也就是ax1+ by1 == ay2+ b(x2-
[a / b] *y2);

根据恒等定理得:x1=y2; y1=x2-
[a / b] *y2;

这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于
x2,y2.

上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
long s,t;
void exgcd(long a,long b)
{
if(b==0)
{
s=1;t=0;
}
else
{
exgcd(b,a%b);
long tmp;
tmp=s; s=t; t=tmp-a/b*t;
}
}
int main()
{
long a,b;
while(scanf("%ld%ld",&a,&b)!=EOF)
{
exgcd(a,b);
printf("%ld %ld\n",s,t);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: