Description
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
Source
应用的是扩展欧几里得:
ax+by=gcd(a,b);
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
__int64 X,Y,Q;
__int64 x,y,m,n,L;
__int64 T;
//用扩展欧几里得求取x,y,q;q为最大公约数;
void Extra_gcd(__int64 a,__int64 b)
{
if(b==0)
{
X=1;
Q=a;
Y=0;
}
else
{
Extra_gcd(b,a%b);
int t=X;
X=Y;
Y=t-a/b*Y;
}
}
//用公式X=(x%b1+b1)%b1;求出最小数
bool solve()
{
__int64 b=L;
if(T%Q==0)
{
T=T/Q;
b=b/Q;
if(b<0)
b=-b;
X*=T;
X=(X%b+b)%b;
return true;
}
else
return false;
}
int main()
{
while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)!=EOF)
{
Extra_gcd(n-m,L);
T=x-y;
if(solve())
printf("%I64d\n",X);
else
printf("Impossible\n");
}
return 0;
}