poj 1061 青蛙的约会
http://poj.org/problem?id=1061
这题的关键就是找方程:
要想青蛙能碰面,就满足方程:
(x+m*t) - (y+n*t) = p*l;
t:跳的次数
p:两只青蛙相差的圈数
l:纬度线的长度
将上述方程整理得:
(n-m)*t + p*l = x-y;
令a=n-m,b=l,c=gcd(a,b),d=x-y;
所以就有:
a*t + b*p = d;
就是求解t的最小正整数;
1 #include <iostream> 2 #include<cstdio> 3 using namespace std; 4 long long x,y,n,m,l,x1,y1,a,b,c,d; 5 long long exgcd(long long a,long long b) 6 { 7 long long tmp; 8 if(b==0) 9 { 10 x1=1;y1=0; 11 return a; 12 } 13 d=exgcd(b,a%b); 14 tmp=x1; 15 x1=y1; 16 y1=tmp-a/b*x1; 17 return d; 18 } 19 int main() 20 { 21 while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l)) 22 { 23 a=n-m; 24 b=l; 25 c=x-y; 26 d=exgcd(a,b); 27 if(c%d!=0) 28 { 29 printf("Impossible\n"); 30 continue; 31 } 32 x1=c/d*x1; 33 y1=c/d*y1; 34 long long k=x1*d/b; 35 k=x1-k*b/d; 36 if(k<0) 37 k=k+b/d; 38 printf("%lld\n",k); 39 } 40 return 0; 41 }