#include<cstdio>
using namespace std;
/*
A 起点x,速度m;B 起点y 速度n 环的总长度L
(x+m*t)-(y+n*t)=k*L;
(m-n)*t+(-L)*k=(y-x)运用扩展欧几里德
d=gcd((m-n),(-L))
if (y-x)%d==0 有解
*/
typedef long long LL;
LL x,y,n,m,L;
//扩展欧几里德
void extend_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
if(!b)
{
d=a;
x=1;
y=0;
}
else
{
extend_gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L))
{
LL d,t,k;
extend_gcd(m-n,-L,d,t,k);
if((y-x)%d!=0)//无解
{
printf("Impossible\n");
}
else
{
t=t*(y-x)/d;//扩大相应倍数
LL l=L/d;
if(l<0)
{
l=-l;
}
t%=l;//要求t最小,取模
if(t<0)//合法的t, t>=0
{
t+=l;
}
printf("%lld\n",t);
}
}
return 0;
}
POJ - 1061 青蛙的约会 (扩展欧几里德)
最新推荐文章于 2019-07-14 07:24:34 发布