现在才AC这道题,无限囧。。记得老早就看过这道题
题目大意:青蛙A的出发点为x,青蛙B的出发点为y,A跳一次m米,B跳一次n米。所在的纬度线(一圈)为L;
思路:扩展欧几里得的入门题:
(1)、两者相遇的条件:x+mt-y-nt=pL
(n-m)t+Lp=x-y;
即是:at+bp=x-y
求出最小的t
所以先要求出gcd(a,b);
即是:exgcd(n-m,L,ar,br);//ar,br对应于关系于t,p;
此函数返回 M=gcd(n-m,L);
X=ar(对应的关系);
(2)、如果(x-y)%M==0,则有解
(3)、有解后:X=X(x-y)/M;
最后:(X%(L/M)+L/M)%(L/M)就是最后的解,也就是本题中t的值;(写了这些感觉都是在默写~~还不是很透彻理解~~囧。。)
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
typedef __int64 LL ;
LL exgcd(LL a,LL b,LL &x,LL &y)
{
LL t,d;
if(b==0)
{
x=1;
y=0;
return a;
}
d=exgcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*y;
return d;
}
int main()
{
LL x,y,m,n,l;
while(cin>>x>>y>>m>>n>>l)
{
LL ar,br,M;
M=exgcd(n-m,l,ar,br);
if((x-y)%M || m==n)
cout<<"Impossible"<<endl;
else
{
ar=ar*(x-y)/M;
LL s=l/M;
cout<<(ar%s+s)%s<<endl;
}
}
}