2021年8月12日木曜日

JAG Summer Camp 2017 Day 1 C - すごろく

まずはBiB_iがすべて00であるような問題を考える。ループがない、つまり同じマスに二回止まることがないので、ゴール以前の各マスに止まる確率を足し合わせたものが求める期待値になっている。

p(i)=p(i) = サイコロを振ってiiが書かれた面が出る確率 dp[x]=\operatorname{dp}[x] =マスxxに止まる確率

とするとき、0-basedで考えると遷移は

dp[x]=0kxdp[xk]p(k)\operatorname{dp}[x] = \sum_{0 \le k \le x}\operatorname{dp}[x-k]p(k)

となって、これはオンラインFFTで解ける形になっている。

BiB_iが必ずしも0でない場合について考える。Bx>0B_x > 0であるようなマスxxについては、オンラインFFT中にdp[x]\operatorname{dp}[x]に加算する時に、代わりにdp[x+Bx]\operatorname{dp}[x+B_x]に加算すればよい。また、Bx<0B_x < 0、つまり休みのマスについては、そのようなマスに止まる確率×Bx\times |B_x|を結果に足せばよさそう……だが、他のマスからBBの影響で進んできた場合は休まないので、dp\operatorname{dp}を構成し終えてからdp[x]×Bx\operatorname{dp}[x] \times |B_x|を後で足すと正しく計算できない。やはりオンラインFFT中にdp[x]\operatorname{dp}[x]に加算する瞬間に結果に足す必要がある。