题目:
青蛙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;
}