AtCoder Beginner Contest 288 D問題 Range Add Query
問題
提出解答
問題の概要
整数列 が以下の操作を好きな回数だけ行うことで全ての項を にすることができるとき, は良い数列であるという.
- 及び整数 を選び, の全てに を足す.
長さ の整数列 がある. 次の 個の問に答えよ.
- の第 項から第 項までの部分列は良い数列か?
制約
解法 (1) 良い数列の特徴づけ
整数列 に対して, 以下は同値である.
- は良い数列である.
- に対して, とする. このとき, である.
(上) ならば (下)について, 各操作は可逆である. 連続する 個の項を 増やすことの逆操作は同じ連続する 個の項を 減らすことである. このとき, 連続する 個の整数 について, これを で割った余りは が 回ずつ登場する. よって, は全て だけ減る.
全ての項が であるとき, であるから, 初期状態においても である.
(下) ならば (上) について, 次のようにすることで, に対して, の第 項を に, 第 項を にすることができる.
- の第 項全てに を足す.
- の第 項全てに を足す.
これを の順に行うと, は次のようになる.
(下) の仮定から, であるから, 最後に第 に対して, を足すことで, 全ての項を にすることができた.
解法 (2) 判定
よって, 特徴づけにより, 求めるべきは において, に対して, 添字を で割った余りが であるような第 項における総和が によらず一致するか? という問題に帰着された.
このとき, 第 項から第 項までに対して, 添字を で割った余りが であるような第 項における総和 は を であるならば第 項を そうでなければ であるような整数列とすると, で求められる. これは累積和による前計算によって高速化できる.
よって, に対して, かどうかを判定すればよく. これは前計算のおかげで 時間で判定できる.
従って, 全体で 時間で求めることができた.