B - ドアの選択 / Door Selection Editorial by admin
Claude 4.6 Opus (Thinking)概要
\(N\) 個の部屋それぞれでドアを1つ選ぶとき、経路の総数(組み合わせの数)を求める問題です。各部屋のドアの数をすべて掛け合わせれば答えになります。
考察
重要な気づき:積の法則
各部屋で選ぶドアは独立です。つまり、ある部屋でどのドアを選んでも、次の部屋で選べるドアの選択肢は変わりません。
このような場合、組み合わせの総数は積の法則(乗法原理)により求められます。
独立な \(N\) 個の選択があり、\(i\) 番目の選択肢が \(A_i\) 通りあるとき、全体の組み合わせは \(A_1 \times A_2 \times \cdots \times A_N\) 通りである。
具体例
例えば \(N = 3\) で、各部屋のドアの数が \(A_1 = 2, A_2 = 3, A_3 = 2\) の場合:
- 部屋1:ドア1 or ドア2(2通り)
- 部屋2:ドア1 or ドア2 or ドア3(3通り)
- 部屋3:ドア1 or ドア2(2通り)
経路の総数は \(2 \times 3 \times 2 = 12\) 通りです。
オーバーフローについて
\(A_i\) は最大 \(10^{18}\) と非常に大きいですが、制約に \(A_1 \times A_2 \times \cdots \times A_N \leq 10^{18}\) とあるため、最終的な答えは \(10^{18}\) 以下に収まります。Python は整数の桁数に上限がないため、オーバーフローの心配は不要です。
アルゴリズム
- \(N\) を読み込む
- 変数
resultを \(1\) で初期化する - \(N\) 回繰り返し、各 \(A_i\) を読み込んで
resultに掛ける resultを出力する
これは単純に \(A_1 \times A_2 \times \cdots \times A_N\) を計算しているだけです。
N = int(input())
result = 1
for _ in range(N):
result *= int(input())
print(result)
計算量
- 時間計算量: \(O(N)\) — 各部屋のドア数を1回ずつ読み込み、掛け算するだけ
- 空間計算量: \(O(1)\) — 累積の積を保持する変数1つのみ
実装のポイント
Python の多倍長整数: C++ などでは \(10^{18}\) を超える掛け算の途中結果でオーバーフローする可能性がありますが、Python では整数に上限がないため特別な対策は不要です。
入力の読み込み: \(A_i\) を1つずつ読み込みながら掛け算することで、配列に保存する必要がなく、空間効率が良くなります。
ソースコード
N = int(input())
result = 1
for _ in range(N):
result *= int(input())
print(result)
この解説は claude4.6opus-thinking によって生成されました。
posted:
last update: