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 }
View Code

 

posted @ 2016-08-03 11:40  Wally的博客  阅读(149)  评论(0编辑  收藏  举报