Official

A - 往復パトロール / Round-Trip Patrol Editorial by admin Editorial for printing

GPT 5.2 High

概要

待機所(チェックポイント \(N\))からチェックポイント \(1\) へ行って戻る移動を \(M\) 回繰り返すとき、移動時間の合計を求める問題です。

考察

重要な点は、アラームが鳴るたびの行動が毎回まったく同じであることです。

  • チェックポイントは一直線上に並び、隣同士の移動が \(1\) 秒なので、距離は番号差の絶対値になります。
  • 待機所はチェックポイント \(N\)、確認先は常にチェックポイント \(1\)。

よって、1回のアラームでの移動は次の往復です: - 行き:\(N \to 1\) の時間は \(|N-1| = N-1\) 秒 - 帰り:\(1 \to N\) の時間も \(N-1\) 秒

合計で1回あたり \(2(N-1)\) 秒かかります。

素朴に「\(M\) 回分をループで足す」方法でも数式上は正しいですが、制約が \(M \le 10^9\) と非常に大きいため、ループすると実行時間が間に合いません(TLEの原因)。
そこで、1回分の時間を求めてから \(M\) 倍するだけで一瞬で計算できます。

具体例: - \(N=4\) のとき、1回の往復は \(4 \to 1\) に \(3\) 秒、\(1 \to 4\) に \(3\) 秒で合計 \(6\) 秒 - \(M=5\) 回なら合計は \(6 \times 5 = 30\) 秒

アルゴリズム

  1. 1回の往復にかかる時間は \(2(N-1)\) を計算する
  2. それを \(M\) 回繰り返すので、答えは \(2(N-1)M\)
  3. 上式をそのまま出力する

計算量

  • 時間計算量: \(O(1)\)
  • 空間計算量: \(O(1)\)

実装のポイント

  • \(N, M\) は最大で \(10^9\) なので、答えは最大で \(2 \times (10^9-1) \times 10^9 \approx 2 \times 10^{18}\) になります。Python の int は任意精度なのでオーバーフローせず安全です(他言語なら64bit整数が必要)。

  • ループは不要で、式 2 * (N - 1) * M をそのまま出力します。

    ソースコード

import sys

def main():
    N, M = map(int, sys.stdin.readline().split())
    print(2 * (N - 1) * M)

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: