Official

Ex - Flipping Coins 2 Editorial by nok0


解説目次

  1. Multipoint Evaluation の解説

  2. 問題の言い換え

  3. 包除原理の適用

  4. \(\mathrm{O}(N^2)\) 解法

  5. \(\mathrm{O}(N\log^2 N)\) 解法


[1] Multipoint Evaluation

はじめに、この問題を解くのに必要な Multipoint Evaluation(多点評価)と呼ばれるテクニックの概要を説明します。

Multipoint Evaluation とは?

\(N\) 次多項式 \(f(x)\) と長さ \(M\) の整数列 \(x=(x_1,x_2,\ldots,x_M)\) にたいし、\(f(x_1),f(x_2),\ldots,f(x_M)\) を求めるのを \(\mathrm{O}(M\log^2M + N\log N)\) で行うテクニックです。

剰余の定理を使います。 \(f(a)=f(x)\bmod(x-a)\) を用いると、 \(f(x) \bmod(x-x_1),f(x)\bmod(x-x_2),\ldots,f(x)\bmod(x-x_M)\) が求まれば良いです。

これは分割統治が適用できます。はじめに、subproduct tree と呼ばれる二分木を葉から構築していきます。葉には \((x-x_1),(x-x_2),\ldots,(x-x_M)\) を書き、その一段上には子二つの積、すなわち \((x-x_1)(x-x_2),(x-x_3)(x-x_4),\ldots\)を書き、… というのを繰り返します。

次に、多項式 \( f,g,h\) にたいして \(f\bmod g = (f\bmod gh) \bmod g\) であることを用いて、subproduct tree を使いながら計算を行います。

subproduct tree の根を用いて、まず \(f \bmod\big((x-x_1)(x-x_2)\ldots(x-x_M)\big)\) を計算します。次に、その計算結果及び subproduct tree の根の子を用いて \(\big(f \bmod\big((x-x_1)(x-x_2)\ldots(x-x_M)\big)\big) \bmod \big((x-x_1)(x-x_2)\ldots(x-x_\frac{M}{2})\big)\) を計算します。(簡単のため、 \(M\) が二冪であるとしています。)

subproduct tree 上で根から葉にかけてこのような計算をすることで、\(f(x) \bmod(x-x_1),f(x)\bmod(x-x_2),\ldots,f(x)\bmod(x-x_M)\) が全て計算できます。計算量解析については省略しますが、\(\mathrm{O}(M\log^2M + N\log N)\) になります。

より詳しくは、以下に挙げる参考文献をご覧ください。


[2] 問題の言い換え

以下、この問題の解説を行います。

\(A\) は昇順であると仮定して問題ありません。

はじめに、対称性よりどのコインも \(N\) 回の操作終了時に表である確率は等しいので、 コイン \(N-1\) が操作終了時に表である確率が求まれば良いです。

証明

$p$ を rotate すると、各コインのひっくり返る回数も rotate することから従います。

コイン \(N-1\) がちょうど \(K\) 回ひっくり返されるような順列の個数を \(F(K)\) として、 \(K=0,1,\ldots,N\) について \(F(K)\) が求まればよいです。

\(F(K)\) は、\(P_i \geq N-1-A_i\) を満たす \(i\) の個数がちょうど \(K\) 個であるような順列 \(P\) の個数と等しいです。便利のため、 \(B_i = N-1-A_i\) とします。このとき \(B\) は単調減少になります。


[3] 包除原理の適用

[2] で述べた \(F(K)\) は直接求めるのは難しいです。\(\lbrace 1,2,\ldots,N\rbrace\) の部分集合 \(S\) であって \(|S|=L\) を満たすもの全てに対して、

  • \(i \in S \Rightarrow P_i \geq B_i\)

を満たす順列 \(P\) の個数を求め、その総和を \(G(L)\) とおくことにします。

このとき、 \(F\)\(G\) には以下の関係式が成り立ちます。

\(\displaystyle G(L)=\sum_{L \leq K} \binom{K}{L}F(K)\)

上記の関係式を用いれば、\(G\) が求まれば \(F\) を復元できます。なお、この復元の部分はARC140-Fでも出ていますので、適宜そちらの解説も参考にしてください。

\(a_i = (N-i)!G(N-i), b_i = (N-i)!F(N-i)\) と置き、その母関数を \(a(x),b(x)\) とします。

このとき \(a_{i} = \sum_{j =0} ^ {i} b_j\frac{1}{(i-j)!} \) です。このことより \(a(x)=b(x)e^{x}\) と表せるので、\(b(x)=a(x)e^{-x}\) から \(\mathrm{O}(N\log N)\)\(F\) を求められます。

以下 \(G\) を求めることとします。


[4] \(\mathrm{O}(N^2)\) 解法

\(G\) は以下のような動的計画法で求められます。

  • \(\mathrm{dp}[i][j]:\) 順列 \(P\) のうち先頭の \(i\) 個の index まで見て、意図的に \(P_i \geq B_i\) を満たす \(i\) の個数が \(j\) 個であるような決め方の個数

この dp の遷移を考えます。

  • \(i\) で意図的に \(P_i \geq B_i\) を満たすようにするとき

    • \((N-B_i-(j-1))\mathrm{dp}[i-1][j-1]\) 通り
  • \(i\) で意図的に \(P_i \geq B_i\) を満たすようにはしないとき

    • \(\mathrm{dp}[i-1][j]\) 通り

よって遷移は以下で表されます。

\(\mathrm{dp}[i][j] = (N-B_i-(j-1))\mathrm{dp}[i-1][j-1]+ \mathrm{dp}[i-1][j]\)

最終的に、 \(G(K) = \mathrm{dp}[N][K] (N-K)!\) と求められます。

計算量は \(\mathrm{O}(N^2)\) であり、実行時間に間に合わせるのは極めて困難です。

なお、この動的計画法は俗に箱根駅伝DPと呼ばれています。

箱根駅伝DP の練習問題


[5] \(\mathrm{O}(N\log^2N)\) 解法

[4]での dp を、形式的冪級数で考えることとします。

はじめに、 \(\mathrm{dp2}[i][i-j] \coloneqq \mathrm{dp}[i][j]\) とします。(この式変形をする嬉しさは、後ほどわかります)

このとき

\(\mathrm{dp2}[i][j] = (N-B_i-(i-j-1))\mathrm{dp2}[i-1][j]+ \mathrm{dp2}[i-1][j-1] = (N-B_i + 1 -i+ j)\mathrm{dp2}[i-1][j]+ \mathrm{dp2}[i-1][j-1]\)

が成り立ちます。

さらに \(f_i(x)\)\(\mathrm{dp2}[i]\) の母関数とし、簡単のため \(C_i \coloneqq N-B_i +1-i\) と定めます。

このとき、\(f_i(x)\) の関係式は以下となります。

\[f_i(x) = C_i f_{i-1}(x) +xf'_{i-1}(x) +xf_{i-1}(x)=x(f_{i-1}(x)+f'_{i-1}(x)) + C_i f_{i-1}(x)\]

唐突ですが、両辺に \(e^x\) をかけてみます。

\[f_i(x)e^x = x(f_{i-1}(x)e^x+f'_{i-1}(x)e^x) + C_i f_{i-1}(x)e^x = x(f_{i-1}(x)e^x)' + C_i f_{i-1}(x)e^x\]

\(g_i(x) \coloneqq f_i(x)e^x\) とおけば、\(g_i(x)=xg'_{i-1}(x)+C_i g_{i-1}(x)\) を得ます。\([x^j]g_i(x)\)\(g_{i,j}\) と書くと、\(g_{i,j}=jg_{i-1,j}+C_i g_{i-1,j} = (j + C_i) g_{i-1,j}\) です。

以上より \(g_{N,j} = g_{0,j}\prod_{i=1}^N(j + C_i)\) が得られます。ここまでくると、[1]の多点評価が適用できる形になります。

多項式 \(h\)\(h(x)=\prod_{i=1}^N(x+ C_i)\) で定めると、\(j=0,1,\ldots,N\)\(h\) に代入すれば \(\prod_{i=1}^N(j + C_i)\) が全ての \(j\) について得られます。多点評価により \(\mathrm{O}(N\log^2N)\)\(g_{N,j}\) が列挙でき、\(g_N(x)\) が求まりました。\(g_N(x)\)\(e^{-x}\) を掛けることで \(f_N(x)\) も求まり、ここから \(G(K)\) も求まります。

以上より、この問題を \(\mathrm{O}(N\log^2N)\) で解くことができました。

posted:
last update: