a:青蛙a的起点
b:青蛙b的起点
m:青蛙a一次能跳多远
n:青蛙b一次能跳多远
L:一圈的距离
(b-a):a要追b多少米
(m-n):每跳一次,a能追b多少米
x是总共跳了多少次
y是a追b不一定会在一圈内追完,而是追了y圈
(m - n)*x = b - a + y*L
(m - n)*x - y*L = b - a
——————— — —————
已知 已知 已知
扩展欧几里得求的是
ax+by=d
a已知,b已知,d是a和b的最大公约数,求x,y
因此把上式的a替换乘(m-n),b替换成L。
式子变成(m-n)*x+(-y)*L=d
如果(b-a)%d不等于0,两只青蛙永远不会碰面
如果(b-a)%d等于零,把(m-n)*x+(-y)*L=d扩大(b-a)/d倍后,x就是结果。
三.代码
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;typedeflonglong LL;//扩展欧几里得
LL exgcd(LL a, LL b, LL &x, LL &y){if(b ==0){
x =1;
y =0;return a;}
LL d =exgcd(b, a % b, y, x);
y -= a / b * x;return d;}intmain(){
LL x, y, m, n, L;
cin >> x >> y >> m >> n >> L;
LL a, b;
LL d =exgcd(m - n, L, a, b);if((y - x)% d)puts("Impossible");//ax + by = d 只能求出来d和d的倍数。else{
a *=(y - x)/ d;//将答案扩大
LL t =abs(L / d);//因为要求正整数解,此时L/d不一定是正数 所以取绝对值。
cout <<(a % t + t)% t << endl;//求最小正整数解}return0;}
四.总结
a
x
+
b
y
=
d
ax + by = d
ax+by=d只能求出来最大公约数和最大公约数的倍数。