F - Adjacent Binomial Coefficients Editorial
by
maspy
まずは列 \(A\) を固定して,\(f(A)\) を解釈します.
\(\displaystyle \binom{A_i+A_{i+1}}{A_i}\) は次の数え上げに等しいです:\(A_i\) 個の \(i\) に \(A_{i+1}\) 個の \(i+1\) を挿入する方法.
そこで,次の操作を考えます:
- 列 \(X\) を \(X = (1,1,\ldots,1,1)\) (\(A_1\) 個)で初期化する.
- \(i=1,2,\ldots,N-1\) に対して次を行う:
- \(X\) に \(A_{i+1}\) 個の \(i+1\) を挿入する.ただし,挿入可能な位置は,\(i\) の直前または列の末尾のみとする.
このようにして得られる列 \(X\) の個数が \(f(A)\) となります.
操作によって作られる列の特徴付けを考えると,本問題の答は次の条件を満たす列 \(X\) の数え上げに等しいことが分かります.
- \(X\) は \(1\) 以上 \(N\) 以下の整数からなる長さ \(M\) の列である.また,ちょうど \(K\) 個の \(1\) を含む.
- \(X\) の隣接する \(2\) 項 \(X_i,X_{i+1}\) に対して \(X_{i+1}\geq X_i-1\).
後者の条件の必要性は \(X_i\) を挿入するときのことを考えれば分かります.十分性は最大値から順に,挿入手順の逆操作を行うことを考えれば分かります.
\(X\) を \(K\) 個の \(1\) で区切って \((\ldots,1,\ldots,1,\ldots,1,\ldots)\) のように見て,間に挿入できる列がどのようなものを考えると,\(1\) の手前と末尾に挿入できる列の母関数を \(f, g\) として \(f(x)^Kg(x)\) の計算に帰着できます.\(f,g\) はおおよそ次のような列の数え上げの母関数です.
- \(f\):\(2,\ldots,N\) からなる列 \(x\) であって,\(x_{i+1}\geq x_i-1\) となるもの.ただし \(x\) の末尾は \(2\) である.
- \(g\):\(2,\ldots,N\) からなる列 \(x\) であって,\(x_{i+1}\geq x_i-1\) となるもの.
包除原理を考えて,常に \(2\) 以上下がり続けるという列の個数の母関数を求めることで,本問題は \(O(N+M\log M)\) 時間で解くことが出来ます.なお,\(x_{i+1}\geq x_i-1\) という条件を満たす列に関する数え上げは,より難しい版がこの問題で解説されています.
追記:別解のつもりでしたが,公式解説と非常に近いということが分かりました.数直線上の walk (公式解説で数えているもの)について,左移動する位置のみを取り出して並べた列を対応させると,\(X_{i+1}\geq X_i-1\) というタイプの数列(本解説で数えているもの)が得られるという対応があります.
posted:
last update: