最小公倍数を求めよう!
問題概要
台の時計があり、時計
の針はちょうど
秒で時計盤を 1 周する。
最初、全ての時計の針は真っ直ぐ上に向いており、止まっている。イルカは、全ての時計の針を同時に動かし始めた。再び、全ての時計の針が真っ直ぐ上に向くのは何秒後か?
制約
- 答えは
以下
考えたこと
の最小公倍数を求めればよい。そして、
個の最小公倍数を求めるためには、次のようにすればよい。
- 答えを表す変数
resを用意して、res = 1と初期化しておく の順に
resを、「resとT[i]の最小公倍数」で置き換える
このように求められる理由は、次の定理に基づいている。
の最小公倍数は、「
の最小公倍数」と
の最小公倍数に一致する
つまり、前から順に最小公倍数を求めていけば良いのだ。
注意点
一般に、整数 の最小公倍数を求めるためには、
を計算すればよいのだが、これを
a * b / gcd(a, b)
と実装してしまうと、a * b を計算する段階でオーバーフローしてしまうことがある。そのため、
a / gcd(a, b) * b
のように実装するとよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { long long N, T; cin >> N; long long res = 1; for (int i = 0; i < N; i++) { cin >> T; // res と T の最大公約数を求めて、res を置き換える res = res / gcd(res, T) * T; } cout << res << endl; }