洛谷
acwing
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
LL exgcd(LL a, LL b, LL &x, LL &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
LL d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int main()
{
LL a, b, m, n, L;
cin >> a >> b >> m >> n >> L;
LL x, y;
LL d = exgcd(m - n, L, x, y);
//m-n两只青蛙的相对速度, d->相对速度 和 路径长度 的最大公约数 也就是在路径上走循环多次 所到达的点之间相距的最短距离 看成一个青蛙在跳
if ((b - a) % d) puts("Impossible");
//两只青蛙初始的相对位置差 能否被最大公约数d 整除 //也就是 b a 这两点不在上面分析的 任意两点上 也就是无论怎么跳都无法相遇
else
{
x *= (b - a) / d;
//原本等式右边 是 d 要满足 等式右边 = (b-a) 则要 扩大 、、、倍 //扩展欧几里得求出来的 x 从一个点到另外一点相距 是 d 所用的时间
LL t = abs(L / d);
// 这里 的 t 为 跳多次后 路径上会经过点的数量
cout << (x % t + t) % t << endl;
}
return 0;
}