AtCoder AGC010 B - Boxes

解法

N=1のときは明らかにYES

 

以下、N>=2とする。

1回の操作で合計

b=1+2+...+N = N*(N+1)/2

足される。なので

Σ(A[i])がbで割り切れないときはNOとする。

操作回数をtとすると

t = Σ(A[i])/b

ここで数列cを以下のように定める

c[i] = b[(i+1) mod n] - b[i] (0<=i<=n-1)

仮にN=5として

a[i]に

-3, -4, -5, -1, -2

の操作をしたとすると

c[i]の増減は

-1, -1, +4, -1, -1

となる。

一般化してc[i]の増減は

-1, -1, ..., +(N-1), ...,-1, -1

のように表せる。

このc[i]の増減を分解すると

-1, -1, ..., -1, -1 (①)

0, 0, ..., +N, ..., 0, 0 (②)

(②の操作は任意の1箇所で+N)

このように

①の操作と②の操作を別々にすると簡単。

数列cに①の操作をt回すると

d[i] = c[i] - t

が得られる。

あとは②の操作をdに対してt回適用して

すべて0にできればYES

 

まとめなど

必要条件を詰めていって、それが十分条件であることが直感的にわかればいい。階差数列の増減が単純。1回の操作を分解する。

広告を非表示にする