解题思路:因为可以把路径看成一个环,那么对青蛙每次跳跃后再对路径的长度取模,就是青蛙此时的坐标。判断两者青蛙坐标是否相等,相等的话输出坐标就行。如果两只青蛙在同时回到起点时还没有相遇,则永远不能相遇;
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 110
using namespace std;
int main()
{
int x,y,m,n,l;
int flag=0;
while(~scanf("%d%d%d%d%d",&x,&y,&m,&n,&l))
{
int X,Y;
X=x,Y=y;
int sum=0;
while(1)
{
x=(x+m)%l;
y=(y+n)%l;
sum++;
if(x==y)
break;
if(X==x&&Y==y)
{
flag=1;
break;
}
}
if(flag==1)
printf("Impossible\n");
else
printf("%d\n",sum);
}
return 0;
}
上面这道题在百练上也有,当时做的时候就是这个思路代码过了,但是在poj上提交却超时了,没办法上网查了一番才发现是扩展欧几里得,下面用扩展欧几里得写下:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
long long X,Y;
long long exgcd(long long a,long long b)
{
if(b==0)
{
X=1;
Y=0;
return a;
}
long long r=exgcd(b,a%b);
long long t=X;
X=Y;
Y=t-a/b*Y;
return r;
}
int main()
{
long long x,y,m,n,l,a,b,c;
while(~scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l))
{
a=n-m;
b=l;
c=x-y;
long long d=exgcd(a,b);
if(c%d!=0)
{
printf("Impossible\n");
continue;
}
b=b/d;
X=X*c/d;//扩展欧几里得求得是ax+by=gcd(a,b),这里是一般式ax+by=c,所以要将解乘上c在除以gcd
long long ans=(X%b+b)%b;//求最小正整数解
printf("%I64d\n",ans);
}
return 0;
}