E - Sugoroku 4 Editorial by math_hiyoko

畳み込みを用いた解法(numpyによる実装)

この解法ではdp[i][j] = (マスjからi回以内の移動でゴールできる確率)とします。
(今回の実装例では回数に関する変数を使わずに記述しています。)
遷移の式をみるとdp[i]の各要素はdp[i - 1]内の一定幅の部分和として表すことができるので、畳み込みによって遷移を計算できることがわかります。

Pythonライブラリのnumpyを用いれば、1回の遷移が1回の関数呼び出しのみで書けるので実装が楽です。 実装例

畳み込みの部分に数論変換などを使えば\(O\left(K(N + M)\log(N + M)\right)\)で解くことも可能ですが、この問題の制約でその必要はないでしょう。

posted:
last update: