思路:假设青蛙A的位置是a,青蛙B的位置是b,青蛙A的速度是m,青蛙B的速度是n,并假设x次后追上,可以写出方程
(
m
−
n
)
∗
x
=
b
−
a
+
k
∗
L
(m-n)*x=b-a+k*L
(m−n)∗x=b−a+k∗L,其实l是循环的圈数,这时候发现
(
m
−
n
)
(m-n)
(m−n)和
L
L
L是定值,想到用扩展欧几里得求解方程,得到x,但这只是个特解,可能是负数。要用到以下的求全解的公式得到正整数解。
公式1:
a
∗
x
+
b
∗
y
=
g
c
d
(
a
,
b
)
,
x
=
x
0
+
b
/
d
,
y
=
y
0
+
a
/
d
,
其
中
x
0
,
y
0
是
利
用
扩
展
欧
几
里
得
求
得
的
特
解
,
d
是
g
c
d
(
a
,
b
)
a*x+b*y=gcd(a,b),x=x_0+b/d,y=y_0+a/d,其中x_0,y_0是利用扩展欧几里得求得的特解,d是gcd(a,b)
a∗x+b∗y=gcd(a,b),x=x0+b/d,y=y0+a/d,其中x0,y0是利用扩展欧几里得求得的特解,d是gcd(a,b)
然后先把x扩大倍数,再模上L/d,得到正整数解。
int main()
{
//freopen("in.txt", "r", stdin);
ll a, b, m, n, l;
while (cin >> a >> b >> m >> n >> l)
{
ll x, y, d;
ex_gcd(m - n, l, x, y, d);
if ((b - a) % d != 0) { puts("Impossible");continue; }
int k = (b - a) / d;
x *= k;
//求x的正数同解
ll tmp = abs(l / d);
cout << (x%tmp + tmp) % tmp << endl;
}
return 0;
}