题目
规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。求它们跳了几次以后才会碰面。
分析
简单的,得到
x+mk≡y+nk(mod l)x+mk≡y+nk(mod\ \ l)x+mk≡y+nk(mod l)
移项后
km−kn≡y−x(mod l)km-kn≡y-x(mod\ \ l)km−kn≡y−x(mod l)
然后mod l改为
km−kn=y−x+lz(z∈Z)km-kn=y-x+lz(z∈Z)km−kn=y−x+lz(z∈Z)
再移项
k(m−n)−lz=y−xk(m-n)-lz=y-xk(m−n)−lz=y−x
很像了,各取相反数。
k(n−m)+lz=x−yk(n-m)+lz=x-yk(n−m)+lz=x−y
设A为n-m,B为x-y
那么
kA+lz=BkA+lz=BkA+lz=B
扩欧
求出A和z后还要求最小的,所以要除以最大公约数,
then
代码
#include <cstdio>
using namespace std;
typedef long long ll;
ll d,x,y,m,n,l,a,b,X,Y;
void exgcd(ll a,ll b,ll &X,ll &Y){
if (!b) X=1,Y=0,d=a;
else exgcd(b,a%b,Y,X),Y-=a/b*X;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
a=n-m; b=x-y;
if (a<0) a=-a,b=-b;//非负整数
exgcd(a,l,X,Y);//扩欧
if (b%d) puts("Impossible");//不可能
else{
int k=l/d;//除以最大公约数
printf("%lld",((X*b/d)%k+k)%k);//求出答案
}
return 0;
}