青蛙的约会 POJ - 1061(题解)

原题

http://poj.org/problem?id=1061

题目大意

题目是讲两只青蛙,起点分别为x,y,第一只青蛙一次跳m米,第二只青蛙一次跳n米,它们在一个长度为l的轴上跳,这条轴是首尾相接的.问至少跳几次,这两只青蛙才能相遇.

题目分析

这道题实际上是求方程 x+km≡y+kn(modL) 化简一下 k(m-n)≡y-x(modL) (m-n)k+Lj=y-x,令a=m-n,b=L,c=y-x,只要求解方程ax+by=c 即可,该方程可以用扩展欧几里得来求,当c%(gcd(a,b))不为0时该方程无解,输出Impossible,否则用扩展欧几里得求解方程 ax+by=gcd(a,b),最后需要让x=x*c/gcd(a,b),x=(x%L+L)%L(保证x是正数)

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 #include <map> 
12 const int INF=0x3f3f3f3f;
13 using namespace std;
14 
15 //扩展欧几里得 
16 long long exgcd(long long a,long long b,long long &x,long long &y)
17 {
18     if(!b) {x=1,y=0;return a;}
19     long long gcd=exgcd(b,a%b,x,y);
20     long long x2=x,y2=y;
21     x=y2;
22     y=x2-(a/b)*y2;
23     return gcd;
24 } 
25 int main()
26 {
27     long long x,y,m,n,l;
28     cin>>x>>y>>m>>n>>l;
29     long long a=n-m,b=l,c=x-y,gcd=exgcd(a,b,x,y);
30     if(c%gcd) cout<<"Impossible"<<endl;
31     else
32     {
33         c/=gcd;
34         x*=c;
35         x=(x%b+b)%b;
36         cout<<x<<endl;
37     }
38     
39     return 0;
40 } 

猜你喜欢

转载自www.cnblogs.com/VBEL/p/10498522.html