原题
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 }