Official

H - Social Distance 2 Editorial by sugarrr


問題文では着席していない \(M-K\) 人を区別していますが、区別せず計算して最後に係数を掛けても良いです。以下、着席していない人を区別しません。

まず、次の値を求めます。

\(f_1(n,k) :=\) \(n\) 個の椅子の両端に人が座っていて、追加で \(k\) 人座る時のスコアの和
\(f_2(n,k) :=\) \(n\) 個の椅子の左端に人が座っていて、追加で \(k\) 人座る時のスコアの和
\(f_3(n,k) :=\) \(n\) 個の空いた椅子に \(k\) 人座る時のスコアの和

\(f_1(n,k)\) を求めます。\(2\) つ方法を紹介します。


形式的冪級数を用いる方法

形式的冪級数についてほとんど知らない、という方はまず maspyさんの形式的べき級数解説 をご覧になることをお勧めします。

以下、「多項式 \(F\)\(n\) 次の係数」を \([x^n]F\) と記載します。

\(f_1(n,k)\) を求めます。

\(\displaystyle f_1(n,k) = \sum_{i=0}^{n-1} [x^i] \{(x + 2x^2 + 3x^3 + \cdots)^k (n-1-i) \}\)

が成り立つので、

\(\displaystyle \frac{1}{(1-T)^k} = \sum_{n=0}^{\infty} \left( \begin{matrix} n+k-1 \\ k-1 \end{matrix} \right) T^n\)

などを用いて式変形すると、

\(\displaystyle f_1(n,k)\)

\(\displaystyle= \sum_{i=0}^{n-1} [x^i] \{(x + 2x^2 + 3x^3 + \cdots)^k (n-1-i) \} \)

\(\displaystyle=[x^{n-1}] (x + 2x^2 + 3x^3 + \cdots)^{k+1}\)

\(\displaystyle=[x^{n-k-2}] (1 + 2x + 3x^2 + \cdots)^{k+1}\)

\(\displaystyle=[x^{n-k-2}] \frac{1}{(1-x)^{2k+2}} \)

\(\displaystyle=\left( \begin{matrix} n+k-1 \\ 2k+1 \end{matrix} \right)\)

となり、\(f_1(n,k)\) を求めることができました。


Combinatorialな言い換えで解く方法

\(n+k+1\) 個の椅子がある。\(k+2\) 箇所に人を座らせる(ただし両端には必ず人を座らせる)。さらに、人と人の間にボールを \(k+1\) 個置く。\(1\) つの椅子に人とボール両方を配置することはできない。
条件を満たす配置は何通りあるか?

上記の問題の答えと、\(f_1(n,k)\) は一致します。
さらに言い換えると、

\(n+k-1\) 個の椅子から、配置場所を \(2k+1\) 箇所選ぶのは何通りあるか?

となり、これは \(\left( \begin{matrix} n+k-1 \\ 2k+1 \end{matrix} \right)\) です。

よって、\(f_1(n,k)\) を求めることができました。


同様の議論で、

\(f_2(n,k) = \left( \begin{matrix} n+k-1 \\ 2k \end{matrix} \right) \)

\(f_3(n,k) = \left( \begin{matrix} n+k-1 \\ 2k-1 \end{matrix} \right)\)
を導けます。


元の問題に戻ります。

\(K=0\) のとき、\(f_3\) を用いればよいです。

\(K \neq 0\) のとき、\(f_1,f_2\) を多項式の係数として用いて次の問題に帰着します。

多項式が \(K+1\) 個与えられる。合計次数は \(N-K\) である。積の \(M-K\) 次の項の係数はいくつか?

分割統治を用いて再帰的に積を計算します。
このとき、分割統治は \(O(\log K)\) ステップ行われ、\(1\) ステップあたりの計算量は ACL の convolution を用いれば \(O(N \log M)\) なので、\(O(N \log M \log K)\) で解くことができました。

なお実装上は、deque に多項式を全て入れ、deque の要素が \(2\) 以上の間「先頭の \(2\) つの多項式を取り出し、積を末尾に push する」というアルゴリズムを用いるのが楽だと思います。

posted:
last update: