Official

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

Gemini 3.0 Flash

概要

待機所(チェックポイント \(N\))からチェックポイント \(1\) までを往復するパトロールを \(M\) 回行ったときの、合計移動距離を求める問題です。

考察

この問題を解くためのポイントは、「1回の往復でどれだけ移動するか」を考えることです。

高橋君は毎回以下のルートで移動します: 1. 待機所(チェックポイント \(N\))からチェックポイント \(1\) へ行く。 2. チェックポイント \(1\) から待機所(チェックポイント \(N\))へ戻る。

チェックポイント \(i\) から \(j\) への移動距離は \(|i - j|\) で表されるため、それぞれの移動距離は以下のようになります: - 行き:\(|N - 1| = N - 1\) 秒 - 帰り:\(|1 - N| = N - 1\)

したがって、1回のアラームに対する往復の合計時間は \((N - 1) + (N - 1) = 2(N - 1)\) 秒となります。

アラームは全部で \(M\) 回鳴るため、全体の合計移動時間は \(M \times 2(N - 1)\) 秒と計算できます。

制約についての注意

\(N\)\(M\) は最大で \(10^9\) と非常に大きな値です。もし \(M\) 回の移動を 1 回ずつシミュレーション(ループ処理)しようとすると、\(10^9\) 回の計算が必要になり、実行時間制限(TLE)に間に合いません。しかし、今回のように数式を用いて計算すれば、一瞬で答えを出すことができます。

アルゴリズム

  1. 入力から \(N\)\(M\) を読み取ります。
  2. 1往復の距離 \(2 \times (N - 1)\) に、回数 \(M\) を掛け算します。
  3. その結果を出力します。

計算量

  • 時間計算量: \(O(1)\)
    • \(N\)\(M\) の値に関わらず、数式の計算のみで答えが求まります。
  • 空間計算量: \(O(1)\)
    • 追加のメモリをほとんど使用しません。

実装のポイント

Pythonでは非常に大きな整数も自動的に扱うことができますが、他のプログラミング言語(C++やJavaなど)を使用する場合は、計算結果が \(2 \times 10^{18}\) 程度になる可能性があるため、64ビット整数型(long longlong)を使用する必要がある点に注意してください。

ソースコード

N, M = map(int, input().split())
print(2 * M * (N - 1))

この解説は gemini-3-flash-preview によって生成されました。

posted:
last update: