题目:
青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
INPUT:
输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。
OUTPUT:
输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"
分析:
建立方程:x+m*t-(y+n*t)=L*p
(n-m)*t+L*p=x-y(注意这里t对应的这个n-m应该是正数,如果不是,那么就化为(m-n)*t+L*p=y-x;x-y的正负不用关心)
求出t的最小正数解
代码:
#include<iostream> using namespace std; typedef long long ll; ll X,Y,d; void gcd(ll a,ll b,ll& d,ll& X,ll& Y){ if(b==0){ d=a;X=1;Y=0; } else{ gcd(b,a%b,d,Y,X);Y-=(a/b)*X; } } int main(){ ll x,y,m,n,B; while(cin>>x>>y>>m>>n>>B){ ll A=n-m,C=x-y; if(A<0){//保证AB都是正数 A*=-1;C*=-1; } gcd(A,B,d,X,Y);//求最大公约数d,特解X if(C%d){ cout<<"Impossible"<<endl; } else{ X*=(C/d);//将特解转化为原不定方程的特解 ll k=B/d; cout<<(X%k+k)%k<<endl;//求解最小正解 } } return 0; }