A - 往復パトロール / Round-Trip Patrol 解説 by admin
Claude 4.5 Opus概要
警備員が待機所(チェックポイント \(N\))からチェックポイント \(1\) まで往復するパトロールを \(M\) 回行うときの、総移動時間を求める問題です。
考察
1回の往復にかかる時間を考える
まず、1回のパトロールでどれだけ移動するかを考えましょう。
行き: チェックポイント \(N\) からチェックポイント \(1\) まで移動
- 移動距離: \(N - 1\)(隣り合うチェックポイント間を \(N-1\) 回通る)
- 移動時間: \(N - 1\) 秒
帰り: チェックポイント \(1\) からチェックポイント \(N\) まで移動
- 移動距離: \(N - 1\)
- 移動時間: \(N - 1\) 秒
したがって、1回の往復にかかる時間は \((N - 1) \times 2\) 秒です。
具体例で確認
\(N = 5\), \(M = 3\) の場合を考えてみましょう。
チェックポイント: 1 --- 2 --- 3 --- 4 --- 5(待機所)
- 1回の往復: \(5 \to 1 \to 5\) で \((5-1) \times 2 = 8\) 秒
- 3回往復すると: \(8 \times 3 = 24\) 秒
なぜ単純な計算でよいか
この問題では、各往復は独立しており、毎回同じ経路を通ります。そのため、シミュレーションで1秒ずつ移動を追跡する必要はなく、単純な掛け算で答えが求まります。
もし1秒ずつシミュレーションすると、\(N, M\) が最大 \(10^9\) のため、最大で \(2 \times 10^{18}\) 回の操作が必要となり、TLE(時間制限超過)になってしまいます。
アルゴリズム
- 1回の往復にかかる時間を計算: \((N - 1) \times 2\)
- \(M\) 回往復するので、合計時間は \((N - 1) \times 2 \times M\)
- 結果を出力
これは単純な算術演算のみで解けます。
計算量
- 時間計算量: \(O(1)\)(定数回の演算のみ)
- 空間計算量: \(O(1)\)(変数を数個使用するのみ)
実装のポイント
オーバーフローに注意
\(N\) と \(M\) はそれぞれ最大 \(10^9\) なので、答えは最大で約 \((10^9 - 1) \times 2 \times 10^9 \approx 2 \times 10^{18}\) になります。
- Python: 整数のオーバーフローがないため、特に対策不要
- C++/Java: 64ビット整数型(
long longやlong)を使用する必要があります
計算順序
\((N - 1) \times 2 \times M\) の計算順序はどれでも同じ結果になりますが、可読性のために「1回の往復時間 × 回数」という形で書くと分かりやすいです。
ソースコード
N, M = map(int, input().split())
# 1回の往復で (N-1) * 2 秒かかる
# M回往復するので、合計は (N-1) * 2 * M 秒
print((N - 1) * 2 * M)
この解説は claude4.5opus によって生成されました。
投稿日時:
最終更新: