点击打开链接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 时
设 ax
1+ by
1= gcd(a,b);
bx
2+ (a mod b)y
2= gcd(b,a mod b);
根据朴素的
欧几里德原理有 gcd(a,b) = gcd(b,a mod b);
则:ax
1+ by
1= bx
2+ (a mod b)y
2;
即:ax
1+ by
1= bx
2+ (a - [a / b] * b)y
2=ay
2+ bx
2- [a / b] * by
2;
也就是ax
1+ by1 == ay
2+ b(x
2- [a / b] *y
2);
根据恒等定理得:x
1=y
2; y
1=x
2- [a / b] *y
2;
这样我们就得到了求解 x
1,y
1 的方法:x
1,y
1 的值基于 x
2,y
2.
上面的思想是以递归定义的,因为 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;
}