您的位置:首页 > 其它

POJ 1061 青蛙的约会(扩展欧几里德)

2012-07-30 12:49 302 查看
/*设过s步后两青蛙相遇,则必满足以下等式:(x+m*s)-(y+n*s)=k*l变形得:(n-m)*s+k*l=x-y令:a=n-m,b=l,c=x-y得:a*s+b*k=c,根据扩展欧几里德:只要c%gcd(a,b)==0,则两青蛙能相遇,否则不能。所以原问题可用扩展欧几里德解方程。*/代码:

View Code 1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4 __int64 exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y)
5 {
6 if(b==0)
7 {
8 x=1;
9 y=0;
return a;
}
__int64 d=exgcd(b,a%b,x,y);
__int64 t=x;
x=y;
y=t-(a/b)*x;
return d;
}
int main()
{
__int64 a,b,c,d,x,y,m,n,l,x1,y1;
scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l);
a=m-n;
b=l;
c=y-x;
if(a<0)
{
a=-a;
c=-c;
}
d=exgcd(a,b,x1,y1);
if(c%d)
puts("Impossible");
else
{
c/=d;
b/=d;
printf("%I64d\n",((c*x1)%b+b)%b);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: