题目
规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。求它们跳了几次以后才会碰面。
分析
简单的,得到
x
+
m
k
≡
y
+
n
k
(
m
o
d
l
)
x+mk≡y+nk(mod\ \ l)
x+mk≡y+nk(mod l)
移项后
k
m
−
k
n
≡
y
−
x
(
m
o
d
l
)
km-kn≡y-x(mod\ \ l)
km−kn≡y−x(mod l)
然后mod l改为
k
m
−
k
n
=
y
−
x
+
l
z
(
z
∈
Z
)
km-kn=y-x+lz(z∈Z)
km−kn=y−x+lz(z∈Z)
再移项
k
(
m
−
n
)
−
l
z
=
y
−
x
k(m-n)-lz=y-x
k(m−n)−lz=y−x
很像了,各取相反数。
k
(
n
−
m
)
+
l
z
=
x
−
y
k(n-m)+lz=x-y
k(n−m)+lz=x−y
设A为n-m,B为x-y
那么
k
A
+
l
z
=
B
kA+lz=B
kA+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;
}