Description
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input
Output
Sample Input
1 2 3 4 5
Sample Output
4
这道题题意就是求(x+mt)%L=(y+nt)%L的最小正整数解,将原方程化简可以得到(n-m)t+kL=x-y,这样就可以用拓展欧几里得算法解决,下面是程序:
#include<stdio.h>
#include<iostream>
#define ll long long
using namespace std;
ll gcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1;
y=0;
return a;
}
ll tp=gcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-a/b*y;
return tp;
}
int main(){
ll x,y,m,n,l;
while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&n,&m,&l)){
ll a=n-m,b=l,c=y-x;
if(a<0){
a=-a;
c=-c;
}
ll tp=gcd(a,b,x,y);
if(c%tp){
printf("Impossible\n");
}
else{
x=x*c/tp;
b/=tp;
cout<<(x%b+b)%b<<endl;
}
}
return 0;
}
400



被折叠的 条评论
为什么被折叠?



