Official

E - Pass to Next Editorial by camypaper


\(c_i\) を人 \(i\) が右隣の人に渡すボールの個数、とします。

\(\min(c) \neq 0\) のとき、それぞれの人が右隣の人に渡すボールの個数を \(1\) 減らしたとしても処理の結果できる数列は変わりません。よって、\(\min(c) = 0\) の場合のみ考えれば十分です。以降は \(\min(c) = 0\) を仮定します。

そのような \(c\)\(\prod_{i=1}^{N}(a_{i}+1) - \prod_{i=1}^{N}a_i\) 通りありますが、処理によってできる数列は相異なります。 よって、\(\min(c)=0\) であるような数列それぞれについて処理の結果できる数列を求め、その総乗の総和を求めればよいです。

\(\prod_{i=1}^{N}x_i\) というのはそれぞれの人が処理後に持っているボールから \(1\) つ選ぶ方法の総数と同値です。 \(c_1, c_2, \ldots, c_i\) を決めたときに人 \(1, 2, 3, \ldots,i,i+1\) が持っているボールから \(1\) つ選ぶ方法の総数などを動的計画法によって求めればよいです(人 \(1\) や人 \(i+1\) はまだ選んでいない場合についても考慮する必要があることに注意してください)。 これは \(O(N)\) で実行可能で十分高速です。

posted:
last update: