mayoko’s diary

プロコンとかいろいろ。

yukicoder No.356 円周上を回る3つの動点の一致

解法

動点 P0, P1 が 1 秒ごとに近づく距離は, 1/T0 - 1/T1 です。よって, 再び出会うのにかかる時間はその逆数で表せます(この時間を t01 とします。)。

動点 P1, P2 についても同様です(再び出会うのにかかる時間を t02 とする)。

答えは, ある n, m について, t01*n = t02*m を満たす, 最小値です。

まず t01, t02 の分母を揃えるて, 分子についてはそれぞれの最小公倍数を取るようにすれば, 最小の (n, m) のペアが得られるので, 答えを求められます。

pair<ll, ll> calc(ll x, ll y) {
    ll z = y-x;
    ll w = x*y;
    ll g = __gcd(z, w);
    return make_pair(z/g, w/g);
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    vector<ll> T(3);
    for (int i = 0; i < 3; i++) cin >> T[i];
    auto x = calc(T[0], T[1]);
    auto y = calc(T[0], T[2]);
    swap(x.first, x.second);
    swap(y.first, y.second);
    pair<ll, ll> z = make_pair(x.first*y.second, x.second*y.second);
    pair<ll, ll> w = make_pair(y.first*x.second, y.second*x.second);
    ll lcm = z.first/__gcd(z.first, w.first) * w.first;
    ll gcd = __gcd(lcm, z.second);
    cout << lcm/gcd << "/" << z.second/gcd << endl;
    return 0;
}