原题链接:Acwing222

题目描述:两只青蛙住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。

我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经 $0$ 度处为原点,由东往西为正方向,单位长度 $1$ 米,这样我们就得到了一条首尾相接的数轴。

设青蛙A的出发点坐标是 $x$,青蛙B的出发点坐标是 $y$。青蛙A一次能跳 $m$ 米,青蛙B一次能跳 $n$ 米,两只青蛙跳一次所花费的时间相同。纬度线总长 $L$ 米。

现在要你求出它们跳了几次以后才会碰面。

输入格式

输入只包括一行 $5$ 个整数 $x,y,m,n,L$,其中 $x≠y < 2000000000$,$0 < m,n < 2000000000$,$0 < L < 2100000000$。

输出格式

输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行”Impossible”

数据范围

$x≠y<2000000000$, $0<m,n<2000000000$, $0<L<2100000000$

输入样例

1 2 3 4 5

输出样例

4

扩展欧几里得

设A在数轴上 $a$ 点,B在 $b$ 点,跳了 $x$ 步后相遇,绕地球 $y$ 圈,可列式: $$ (m-n) \times x - L.y = b-a $$ 求 $x$ 的最小正整数解。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

LL a, b, m, n, l, x, y;

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() {
    cin >> a >> b >> m >> n >> l;
    LL d = exgcd(m - n, l, x, y);
    if ((b - a) % d) puts("Impossible");
    else {
        x *= (b - a) / d;
        LL mod = abs(l / d);
        printf("%lld\n", (x % mod + mod) % mod);
    } 
    return 0;
}