2020年4月4日土曜日

BCU30 F - 数列と計算

区間[l,r)[l,r)に関する掛け算alal+1...ar1a_l a_{l+1} ... a_{r-1}が何回足されるかを数えればよい。区間の右端を揃えて数えると下の表のようになる:

1 2 3 4 5
a123a_1 \cdot 2^3 a1a222a_1a_2 \cdot 2^2 a1a2a32a_1a_2a_3 \cdot 2 a1a2a3a41a_1a_2a_3a_4 \cdot 1 a1a2a3a4a51a_1a_2a_3a_4a_5 \cdot 1
a222a_2 \cdot 2^2 a2a32a_2a_3 \cdot 2 a2a3a41a_2a_3a_4 \cdot 1 a2a3a4a51a_2a_3a_4a_5 \cdot 1
a322a_3 \cdot 2^2 a3a42a_3a_4 \cdot 2 a3a4a52a_3a_4a_5 \cdot 2
a422a_4 \cdot 2^2 a4a522a_4a_5 \cdot 2^2
a523a_5 \cdot 2^3

(幅の関係でN=5N=5でやったけど、N=6N=6くらいのほうがわかりやすいかも)

上の表から、axa_xを右端とする掛け算の総和からax+1a_{x+1}を右端とする掛け算の総和を得るには、だいたいax+1/2a_{x+1} / 2を掛ければよいということがわかる。この係数で帳尻を合わせるために少し改変すると、次のようになる:

0 1 2 3 4 5
242^4 a123a_1 \cdot 2^3 a1a222a_1a_2 \cdot 2^2 a1a2a32a_1a_2a_3 \cdot 2 a1a2a3a41a_1a_2a_3a_4 \cdot 1 a1a2a3a4a51a_1a_2a_3a_4a_5 \cdot 1
232^3 a222a_2 \cdot 2^2 a2a32a_2a_3 \cdot 2 a2a3a41a_2a_3a_4 \cdot 1 a2a3a4a51a_2a_3a_4a_5 \cdot 1
232^3 a322a_3 \cdot 2^2 a3a42a_3a_4 \cdot 2 a3a4a52a_3a_4a_5 \cdot 2
232^3 a422a_4 \cdot 2^2 a4a522a_4a_5 \cdot 2^2
232^3 a523a_5 \cdot 2^3
232^3

したがってdp[0]:=2N1\operatorname{dp}[0] := 2^{N-1}で初期化したあと、dp[x]:=dp[x1]ax/2+2N2\operatorname{dp}[x] := \operatorname{dp}[x-1]\cdot a_{x}/2 + 2^{N-2}と更新していけばよさそう。ただし、最後だけは1/21/2を掛けずにdp[N]:=aNdp[N1]+2N2\operatorname{dp}[N] := a_{N}\operatorname{dp}[N-1] + 2^{N-2}とする。

dp[1]\operatorname{dp}[1]からdp[N]\operatorname{dp}[N]までを、不要な2N22^{N-2}を引きながら足していけば、答えが得られる。


端が含まれると足される回数が変わるということを整理するのに時間がかかった。