区間[l,r)に関する掛け算alal+1...ar−1が何回足されるかを数えればよい。区間の右端を揃えて数えると下の表のようになる:
1 |
2 |
3 |
4 |
5 |
a1⋅23 |
a1a2⋅22 |
a1a2a3⋅2 |
a1a2a3a4⋅1 |
a1a2a3a4a5⋅1 |
|
a2⋅22 |
a2a3⋅2 |
a2a3a4⋅1 |
a2a3a4a5⋅1 |
|
|
a3⋅22 |
a3a4⋅2 |
a3a4a5⋅2 |
|
|
|
a4⋅22 |
a4a5⋅22 |
|
|
|
|
a5⋅23 |
(幅の関係でN=5でやったけど、N=6くらいのほうがわかりやすいかも)
上の表から、axを右端とする掛け算の総和からax+1を右端とする掛け算の総和を得るには、だいたいax+1/2を掛ければよいということがわかる。この係数で帳尻を合わせるために少し改変すると、次のようになる:
0 |
1 |
2 |
3 |
4 |
5 |
24 |
a1⋅23 |
a1a2⋅22 |
a1a2a3⋅2 |
a1a2a3a4⋅1 |
a1a2a3a4a5⋅1 |
|
23 |
a2⋅22 |
a2a3⋅2 |
a2a3a4⋅1 |
a2a3a4a5⋅1 |
|
|
23 |
a3⋅22 |
a3a4⋅2 |
a3a4a5⋅2 |
|
|
|
23 |
a4⋅22 |
a4a5⋅22 |
|
|
|
|
23 |
a5⋅23 |
|
|
|
|
|
23 |
したがってdp[0]:=2N−1で初期化したあと、dp[x]:=dp[x−1]⋅ax/2+2N−2と更新していけばよさそう。ただし、最後だけは1/2を掛けずにdp[N]:=aNdp[N−1]+2N−2とする。
dp[1]からdp[N]までを、不要な2N−2を引きながら足していけば、答えが得られる。
端が含まれると足される回数が変わるということを整理するのに時間がかかった。