No.309

各行は1つ前の行にしか依存しないので, 前の行から順に計算していく.

行目の計算であるが, 行目で挙手状況と 行目の知識状況でループし, 状況ごとに 行目の挙手状況を求める.

挙手状況とはその行で誰が挙手しているかどうかの状態であり, 知識状況とはその行で誰が倉敷が何県か知っているかどうかの状態である. これはビットで表現する.

行目の挙手状況になる確率は DP で計算でき, 行目の知識状況になる確率は知識状況の各人のビットと から求められるので, ここから 行目の挙手状況ごとの確率を求めることができる.

行目の挙手状況と 行目の知識状況から 行目の挙手状況を求めるには, 行目の各人の挙手状態を伝播させる必要があり の計算量が必要なため, 全体で の計算量が必要となる.

そこで前処理を行う.

ある行の各人の(挙手状態が伝播する前の)前の人の挙手状態を考慮に入れたポイントは 0〜5 ポイントとなる. 挙手するまでのポイントを考えると 0〜4 ポイントであるが, 挙手するまで3ポイントか4ポイント必要な場合はどちらも挙手しないことが決まっているので, 挙手するまでのポイントは3ポイントとしてまとめる.

ここで各人の残りポイントの状態を行でまとめて行の残りポイント状況として ビットで表現する. この行の残りポイント状況から挙手状況をあらかじめ計算しておく. この前処理の計算量は である.

そして 行目の挙手状況でまず外側のループをまわす. このとき, 行目の人がすべて知っている場合の残りポイント状況を求めることができる.

その上で 行目の知識状況で内側のループをまわす. このとき, 知らない人の残りポイントは3になるので, 外側のループ内で求めた 行目の人がすべて知っている場合の残りポイント状況から 行目のポイント状況をビットのOR演算で求めることができる.

こうしてポイント状況が分かれば前処理によって挙手状況が で求まるので, 行目の挙手状況と 行目の知識状況から 行目の挙手状況を求める計算量を にすることができる.

したがって全体の計算量は となる.