「联合省选 2020 A」组合数问题 题解

前言

这题算是我斯特林数的入门题,顺便安利大佬的博客,我是从这篇博客中学的斯特林数。

前置知识:

  • 二项式定理

    (a+b)n=i=0n(ni)aibni(1)(a+b)^n=\sum_{i=0}^n{\dbinom ni a^ib^{n-i}}\tag1

  • 斯特林数相关知识

    • 斯特林数定义

      • 第一类斯特林数: 第一类斯特林数 [nm]\begin{bmatrix}n\\m\end{bmatrix} 表示将 nn 个不同元素划分为 mm 个轮换的方案数。

      • 第二类斯特林数: 第二类斯特林数 {nm}\begin{Bmatrix}n\\m\end{Bmatrix} 表示把 nn 个不同小球放入 mm 个相同盒子,盒子不能空的方案数。

      • 相关递推式

        [nm]=[n1m1]+(n1)[n1m](2)\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix}\tag2

        {nm}={n1m1}+m{n1m}(3)\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n-1\\m\end{Bmatrix}\tag3

  • 上升下降幂相关知识

    • 定义abˉ=i=0b1(a+i)a^{\bar{b}}=\prod_{i=0}^{b-1}{(a+i)} 称为上升幂,ab=i=0b1(ai)a^{\underline{b}}=\prod_{i=0}^{b-1}{(a-i)} 称为下降幂,而 aba^b 称为普通幂。

    • 普通幂与上升下降幂之间的转换

      xn=k=0n{nk}xk(4)x^n=\sum_{k=0}^n{\begin{Bmatrix}n\\k\end{Bmatrix}x^{\underline{k}}}\tag4

      xn=k=0n(1)nk[nk]xk(5)x^{\underline{n}}=\sum_{k=0}^n{(-1)^{n-k}\begin{bmatrix}n\\k\end{bmatrix}x^k}\tag5

      xn=k=0n(1)nk{nk}xkˉ(6)x^n=\sum_{k=0}^n{(-1)^{n-k}\begin{Bmatrix}n\\k\end{Bmatrix}x^{\bar{k}}}\tag6

      xkˉ=k=0n[nk]xk(7)x^{\bar{k}}=\sum_{k=0}^n{\begin{bmatrix}n\\k\end{bmatrix}x^k}\tag7

    • 下降幂与组合数之间的关系

      (nm)mk=(nkmk)nk(8)\dbinom nm m^{\underline{k}}=\dbinom {n-k}{m-k}n^{\underline{k}}\tag 8

题解

k=0nf(k)×xk×(nk)=k=0n(i=0maiki)xk(nk)(由定义)=k=0n(i=0maij=0i{ij}kj)xk(nk)((4))=k=0n(j=0mkji=0jai{ij})xk(nk)(交换求和顺序)=j=0mqjk=jnxkkj(nk)(qj=i=0jai{ij})=j=0mqjk=jnxknj(njkj)((8))=j=0mqjxjnjk=0njxk(njk)(提取公因式)=j=0mqjxjnj(x+1)nj((1))\begin{aligned}\sum_{k=0}^n f(k) \times x^k \times \dbinom n k&=\sum_{k=0}^n{\left(\sum_{i=0}^m{a_ik^i} \right)x^k\dbinom nk}\texttt{$\big($由定义$\big)$}\\ & = \sum_{k=0}^n{\left(\sum_{i=0}^m{a_i\sum_{j=0}^i{\begin{Bmatrix}i\\j\end{Bmatrix}k^{\underline{j}}}} \right) x^k\dbinom nk}\texttt{$\big($由$\,(4)\big)$}\\&=\sum_{k=0}^n{\left(\sum_{j=0}^m{k^{\underline{j}}\sum_{i=0}^j{a_i\begin{Bmatrix}i\\j\end{Bmatrix}}} \right)x^k\dbinom nk}\texttt{$\big($交换求和顺序$\big)$}\\&=\sum_{j=0}^m{q_j}\sum_{k=j}^n{x^kk^{\underline{j}}\dbinom nk}\texttt{$\bigg($记$\,q_j=\sum_{i=0}^j{a_i}\begin{Bmatrix}i\\j\end{Bmatrix}\bigg)$}\\&=\sum_{j=0}^m{q_j\sum_{k=j}^n{x^k}n^{\underline{j}}\dbinom {n-j}{k-j}}\texttt{$\big($由$\,(8)\big)$}\\&=\sum_{j=0}^m{q_jx^{j}n^{\underline{j}}\sum_{k=0}^{n-j}{x^k\dbinom {n-j}{k}}}\texttt{$\big($提取公因式$\big)$}\\&=\sum_{j=0}^m{q_jx^jn^{\underline{j}}(x+1)^{n-j}}\texttt{$\big($由$(1)\big)$} \end{aligned}

显然 {qj}\{q_j\} 可以在 O(m2)O(m^2) 的时间内预处理出来,剩下的直接套上面的式子就可以 O(mlogn)O(m\log n) 计算。

时间复杂度为 O(m2+mlogn)O(m^2+m\log n),空间复杂度为 O(m2)O(m^2)