扩展欧几里德算法的分析详见本人的 HDU 1576。
这里直接粘贴代码,公式题应该是广大Acmer最喜欢的题目之一了。
#include<stdio.h>
long long Gcd(long long a,long long b)
{
return b?Gcd(b,a%b):a;
}
long long exGcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
long long r=exGcd(b,a%b,x,y);
long long t=x;x=y;y=t-a/b*y;
return r;
}
int main()
{
long long x,y,m,n,l; //a=m-n;b=-l;y-x
long long p,q,gab;
while(~scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l))
{
exGcd(m-n,-l,p,q);
gab=Gcd(m-n,-l);
if(gab==y-x)
printf("%I64d\n",p);
else if((y-x)%gab==0)
{
//p1 = p0*(c/Gcd(a,b)),q1 = q0*(c/Gcd(a,b))
p=p*((y-x)/gab);
int t=1;
//p = p1 + b/Gcd(a, b) * t q = q1 - a/Gcd(a, b) * t
while(p<0)
p=p+(-l)/gab*(t++);
p=p%(-l/gab); //这里公式得到的结果可能不是最简正整数所以要取余
printf("%I64d\n",p);
}
else
printf("Impossible\n");
}
return 0;
}
本文详细介绍了扩展欧几里德算法,并提供了一个具体的C++实现案例。该算法主要用于求解最大公约数及贝祖等式的整数解,通过递归调用实现了对输入整数的最大公约数的高效计算。
1699

被折叠的 条评论
为什么被折叠?



