http://poj.org/problem?id=1061
分析:
由题意可知 求青蛙能否相遇 即求方程 (x+mt)%l=(y+nt)%l 中t的值 化简方程
(x + mt)%l = (y + nt)%l
x + mt - k1l = y + nt - k2l
(m - n)t + (k2 - k1)l = y - x
(m - n)t + kl = y - x
显而易见 这是一个扩展欧几里得 求一下t的最小正整解就好了
AC代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include<list>
#include <bitset>
#include <climits>
#include <algorithm>
#define gcd(a,b) __gcd(a,b)
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
typedef long long LL;
const LL mod=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
using namespace std;
LL exgcd(LL a,LL b,LL &x,LL &y){
if (b==0){
x=1;
y=0;
return a;
}
LL ans=exgcd(b,a%b,y,x);
y-=(a/b)*x;
return ans;
}
int main (){
LL x,y,m,n,l;
while (scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)!=EOF){
LL ans,X,Y;
ans=exgcd(m-n,l,X,Y);
if ((y-x)%ans){
printf ("Impossible\n");
continue;
}
X=(X*(y-x)/ans)%(l/ans);
if (X<0) X+=fabs(l/ans);
printf ("%lld\n",X);
}
return 0;
}