F - Minflip Summation 行列累乗解法 ~京セラプログラミングコンテスト2021(AtCoder Beginner Contest 200)~
↓これ
最終的に文字が同じ連続区間の個数を とすると, の時は答えが , の時は答えが , の時は答えが , ...となりまふ. さらに, 区間の個数は直前の文字と異なるような文字の位置を 個とすると 個となりまふ.
が偶数の状態から奇数の状態になると必要な操作回数が 増えると言えることから, 文字列 の操作回数の期待値は次のような をすると求められまふ.
: 文字目まで考えた時点で の偶奇が で最後の文字が となる確率
尚, 期待値を表す変数は適当に外部に持っておいて が から になる瞬間にその時点の 配列が表す確率を足すものとしまふ.
勿論これは かかってしまいまふが, これは行列累乗で高速化出来まふ. 具体的には, 各 に対して の値を にした状態で に対して上の をすることで遷移の確率と期待値への寄与を求め, 得られた遷移と期待値への寄与を表す行列を 乗しまふ. ここで, 一文字目のために最後の文字が でも でもない状態みたいなのも用意すると面倒でない気がしまふ.
こうして求まるのは期待値なので, 最後に を掛けることで答えになりまふ.