公式
A - 往復パトロール / Round-Trip Patrol 解説 by admin
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回の往復にかかる時間は \(2(N-1)\) を計算する
- それを \(M\) 回繰り返すので、答えは \(2(N-1)M\)
- 上式をそのまま出力する
計算量
- 時間計算量: \(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 によって生成されました。