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: