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)に間に合いません。しかし、今回のように数式を用いて計算すれば、一瞬で答えを出すことができます。
アルゴリズム
- 入力から \(N\) と \(M\) を読み取ります。
- 1往復の距離 \(2 \times (N - 1)\) に、回数 \(M\) を掛け算します。
- その結果を出力します。
計算量
- 時間計算量: \(O(1)\)
- \(N\) と \(M\) の値に関わらず、数式の計算のみで答えが求まります。
- 空間計算量: \(O(1)\)
- 追加のメモリをほとんど使用しません。
実装のポイント
Pythonでは非常に大きな整数も自動的に扱うことができますが、他のプログラミング言語(C++やJavaなど)を使用する場合は、計算結果が \(2 \times 10^{18}\) 程度になる可能性があるため、64ビット整数型(long long や long)を使用する必要がある点に注意してください。
ソースコード
N, M = map(int, input().split())
print(2 * M * (N - 1))
この解説は gemini-3-flash-preview によって生成されました。
posted:
last update: