公式

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. 1回の往復にかかる時間を計算: \((N - 1) \times 2\)
  2. \(M\) 回往復するので、合計時間は \((N - 1) \times 2 \times M\)
  3. 結果を出力

これは単純な算術演算のみで解けます。

計算量

  • 時間計算量: \(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 longlong)を使用する必要があります

計算順序

\((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 によって生成されました。

投稿日時:
最終更新: