点検の 周期の 最大公約数と 最小公倍数
- 数と計算
- 問題 07
- やさしい
- 目安 11 分
2 台の
本番の
入力は
問題
ある
2 台の
- a と b の
最大公約数 (a と b の 両方を 割り切る 正の 整数の うち、 最も 大きい数) - a と b の
最小公倍数 (a でも b でも 割り 切れる 正の 整数の うち、 最も 小さい 数)。 0 日目の あと、 2 台を 同じ 日に 点検するのは、 この 日数の あとになります
入力の形式
T
a_1 b_1
a_2 b_2
...
a_T b_T1 行目に
出力の形式
T 行を
制約
- T は、
1 以上 10000 以下の整数です - a_i と b_i は、
どちらも 1 以上 1000000 以下の整数です
入力と出力の例
例 1
12 と
入力
3 12 18 7 5 4 4
出力
6 36 1 35 4 4
例 2
片方が
入力
2 3 1000000 1 1
出力
1 3000000 1 1
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
ユークリッドのmath.gcd も
Python
Python
import sys
def gcd(a, b):
while b:
a, b = b, a % b
return a
data = sys.stdin.read().split()
t = int(data[0])
lines = []
for i in range(t):
a = int(data[1 + 2 * i])
b = int(data[2 + 2 * i])
g = gcd(a, b)
lines.append(f"{g} {a // g * b}")
print("\n".join(lines))JavaScript
JavaScript
const data = require("fs").readFileSync(0, "utf8").split(/\s+/).filter(Boolean).map(Number);
const t = data[0];
function gcd(a, b) {
while (b !== 0) {
[a, b] = [b, a % b];
}
return a;
}
const lines = [];
for (let i = 0; i < t; i++) {
const a = data[1 + 2 * i];
const b = data[2 + 2 * i];
const g = gcd(a, b);
lines.push(`${g} ${(a / g) * b}`);
}
console.log(lines.join("\n"));計算量
互除法は、
遅い
よく ある間違い
- 最小公倍数を、
大きい ほうの 数の 倍数を 1 倍、 2 倍と 順に 試して探す。 互いに 素な組では 小さい ほうの 数の 回数だけかかり、 最大公約数を 1 から 試すのと 同じくらい 遅くなります - JavaScript で
a / g * bのつもりで a * b / gと書き、 a と b が もっと 大きい 問題で 途中の 数が 正確に 表せる 範囲を 越える。 この 問題の 範囲では 越えませんが、 割ってから 掛ける 癖を 付けておくと安全です - Python で
/を使って 割り、 最小公倍数が 36.0のように小数で 出力される。 整数の 割り算は //を使います - 互除法の
引数の 順を 気にして a と b を 入れ替える 処理を 書き足す。 a が b より 小さい ときは、 1 回目の 余りの 計算で 自然に 入れ替わるので 要りません
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31