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; }