「学习笔记」斯特林数与贝尔数

斯特林数与数幂、贝尔数

写的东西显然大家都会啊。

斯特林数 Stirling

定义第二类斯特林数 \(\begin{Bmatrix} n \\ m\end{Bmatrix}\) 表示 \(n\) 个元素划分成 \(m\) 个集合,每个集合非空的方案数,读作 \(n\) 子集 \(m\)。由于定义是分成若干集合,第二类斯特林数又称 斯特林子集数

我们能类似组合数打一个表:

\(n\) \(\begin{Bmatrix} n \\ 0\end{Bmatrix}\) \(\begin{Bmatrix} n \\ 1\end{Bmatrix}\) \(\begin{Bmatrix} n \\ 2\end{Bmatrix}\) \(\begin{Bmatrix} n \\ 3\end{Bmatrix}\) \(\begin{Bmatrix} n \\ 4\end{Bmatrix}\)
\(0\) 1 0 0 0 0
\(1\) 0 1 0 0 0
\(2\) 0 1 1 0 0
\(3\) 0 1 3 1 0
\(4\) 0 1 7 6 1

我们能发现几个特例:

  1. \(n > m\)\(\begin{Bmatrix} n \\ m\end{Bmatrix} = 0\),因为一定有集合为空。

  2. \(n\geq 1\)\(\begin{Bmatrix} n \\ 1\end{Bmatrix} = 1\) ,这些数只有唯一的分法。

  3. \(n\geq 2\)\(\begin{Bmatrix} n \\ 2\end{Bmatrix}= 2^{n-1} - 1\),第一个数不动,剩下的 \(n - 1\) 个数可以选择和第一个数在一个集合还是不在一个集合,当然还要减去一种全在一个集合的情况。

那么第二类斯特林数有没有和组合数一样的递推关系呢?显然是有的,考虑若 \(n\) 个元素要形成 \(m\) 个集合,第 \(n\) 个元素要么独立成一个集合,要么加入前 \(n - 1\) 个数构成的 \(m\) 个集合中的一个。即:

\[\begin{Bmatrix} n \\ m\end{Bmatrix}=\begin{Bmatrix} n-1 \\ m-1\end{Bmatrix}+m\begin{Bmatrix} n-1 \\ m\end{Bmatrix},n\geq 1 \]

现在来看一看第一类斯特林数\(\begin{bmatrix} n \\ m\end{bmatrix}\) 表示 \(n\) 个数形成 \(m\) 个轮换的方案数,读作 \(n\) 轮换 \(m\)。又称斯特林轮换数。

这里的轮换就好比坐圆桌,\((1,2,3,4)\) 这个轮换与 \((2,3,4,1)\) 相同,但与 \((4,3,2,1)\) 或者 \((1,4,2,3)\) 不同。

我们还是打个表观察一下:

\(n\) \(\begin{bmatrix} n \\ 0\end{bmatrix}\) \(\begin{bmatrix} n \\ 1\end{bmatrix}\) \(\begin{bmatrix} n \\ 2\end{bmatrix}\) \(\begin{bmatrix} n \\ 3\end{bmatrix}\) \(\begin{bmatrix} n \\ 4\end{bmatrix}\)
\(0\) 1 0 0 0 0
\(1\) 0 1 0 0 0
\(2\) 0 1 1 0 0
\(3\) 0 2 3 1 0
\(4\) 0 6 11 6 1

可以轻松发现如下性质:

  1. \(\begin{bmatrix} n \\ 1\end{bmatrix}=(n-1)!\)。这就是圆排列方案数,原本是 \(n!\) 种方法,每种方法被算了 \(n\) 次。
  2. \(\begin{bmatrix} n \\ n-1\end{bmatrix} = \dfrac{n(n-1)}{2}\)。选择两个元素构成一个轮换。
  3. \(\begin{bmatrix} n \\ m\end{bmatrix} \geq \begin{Bmatrix} n \\ m\end{Bmatrix}\)。轮换数是不会比子集数小的,因为每个轮换都对应一个集合,每个集合至少可以形成一种轮换。

我们也能仿照第二类斯特林数求出递归式:

\[\begin{bmatrix} n \\ m\end{bmatrix}=\begin{bmatrix} n-1 \\ m-1\end{bmatrix} + (n-1) \begin{bmatrix} n-1 \\ m\end{bmatrix} \]

元素 \(n\) 单独成一个轮换,或者塞到 \(1\)\(n-1\) 某个数的前面。

对比递归式发现只是第二项的系数不同,一个是 \(m\) 一个是 \(n-1\)

排列和轮换什么关系?一一对应。我们从 \(i\)\(p_i\) 连边,就形成若干环,也就是轮换。这意味着:

\[\sum_{k = 0}^n\begin{bmatrix} n \\ k\end{bmatrix} = n! \]


斯特林数的功能不止于此,它能在通常幂、下降幂、上升幂之间建立联系。

定义下降幂 \(x^{\underline n} = x(x-1)..(x-n+1)\) ,就是不超过 \(x\) 的最大的 \(n\) 个整数相乘。

定义上升幂 \(x^{\overline n}=x(x+1)..(x+n-1)\)

根据定义,\(x < n\)\(x^{\underline n} = 0\)

第二类斯特林数可以实现通常幂转下降幂(公式 1):

\[x^n=\sum_{k = 0}^n \begin{Bmatrix} n \\ k\end{Bmatrix} x^{\underline k} \]

我们可以举 \(n = 3\) 来试一试:

\[x + 3x(x-1) + x(x-1)(x-2)=x+(3x^2-3x)+(x^3-3x^2+2x)=x^3 \]

无关的项都消掉了,的确是剩下 \(x^n\) 项了。

我们来尝试归纳证明。 \(n = 0\) 成立, \(n\geq 1\) 时:

\[\sum_{k = 0}^n \begin{Bmatrix} n \\ k\end{Bmatrix} x^{\underline k} \\ =\sum_{k = 0}^n \begin{Bmatrix} n-1 \\ k-1\end{Bmatrix} x^{\underline k}+k\sum_{k = 0}^n \begin{Bmatrix} n-1 \\ k\end{Bmatrix} x^{\underline k} \\ =\sum_{k = 0}^{n-1} \begin{Bmatrix} n-1 \\ k\end{Bmatrix} x^{\underline {k+1}}+k\sum_{k = 0}^{n-1} \begin{Bmatrix} n-1 \\ k\end{Bmatrix} x^{\underline k} \\ =(x-k)\sum_{k = 0}^{n-1} \begin{Bmatrix} n-1 \\ k\end{Bmatrix} x^{\underline {k}}+k\sum_{k = 0}^{n-1} \begin{Bmatrix} n-1 \\ k\end{Bmatrix} x^{\underline k} \\ =(x-k)x^{n-1}+k x^{n-1} \\ = x^n \]

我们也就证明了结论。上面使用了 \(x^{\underline {k+1}} = x^{\underline k}\cdot(x-k)\) 这个式子。

类似地,第一斯特林数可以实现上降幂转通常幂(公式 2):

\[x^{\overline n}=\sum_{k = 0}^n {} \begin{bmatrix} n \\ k\end{bmatrix} x^k \]

还是举 \(n = 3\) 的例子:

\[2x+3x^2+x^3 =x(2+3x+x^2)=x(x+1)(x+2) = x^{\overline n} \]

证明使用递推公式归纳:

\[\sum_{k = 0}^n \begin{bmatrix} n \\ k\end{bmatrix} x^k \\= \sum_{k = 0}^n \begin{bmatrix} n-1 \\ k-1\end{bmatrix} x^k + (n-1)\sum_{k = 0}^n {} \begin{bmatrix} n-1 \\ k\end{bmatrix} x^k \\= x\sum_{k = 0}^{n-1} \begin{bmatrix} n-1 \\ k\end{bmatrix} x^k + (n-1)\sum_{k = 0}^{n-1} \begin{bmatrix} n-1 \\ k\end{bmatrix} x^k \\=(x+n-1) x^{\overline {n-1}} \\=x^{\overline n} \]

这个证明优美而简洁。

至此,我们有三个量 \(x^{\underline n}<x^n<x^{\overline n}\),第一个公式(斯特林子集数)实现了通常幂转下降幂,第二个公式(斯特林轮换数)实现了上升幂转通常幂。形象地记忆就是沿着 “>” 方向转换。

有没有下降幂转通常幂、通常幂转上升幂的公式?当然也有。我们有个投机取巧的公式:

\[x^{\underline n}=(-1)^n (-x)^{\overline n} \]

因为正数在下降时绝对值减小,负数在上升时绝对值也减小。把这个式子代入上面公式 \(1\)

\[(-x)^n=\sum_{k = 0}^n \begin{Bmatrix} n \\ k\end{Bmatrix} (-1)^k x^{\overline k} \\ x^n=\sum_{k = 0}^n \begin{Bmatrix} n \\ k\end{Bmatrix} (-1)^{n-k} x^{\overline k} \]

代公式 \(2\) 同理。这样我们就得到了 \(2\) 个“逆行变换”公式(公式 3、4):

\[x^n=\sum_{k = 0}^n \begin{Bmatrix} n \\ k\end{Bmatrix} (-1)^{n-k} x^{\overline k} \\ x^{\underline n}=\sum_{k = 0}^n \begin{bmatrix} n \\ k\end{bmatrix} (-1)^{n-k} x^k \]

总结一下,用大一些的幂展开小一些的幂需要添加 \((-1)^{n-k}\) 这样的系数。

这时候思维活跃的同学想到了把公式 2 代入公式 3 中,即通常幂转上升幂中的「上升幂」用通常幂展开,得到:

\[x^n=\sum_{k = 0}^n \begin{Bmatrix} n \\ k\end{Bmatrix} (-1)^{n-k} \sum_{m = 0}^k \begin{bmatrix} k \\ m\end{bmatrix} x^m \\=\sum_{k,m} \begin{Bmatrix} n \\ k\end{Bmatrix} \begin{bmatrix} k \\ m\end{bmatrix}(-1)^{n-k} x^m \]

等式连边对应系数得一样,\(x^n\) 项系数是 \(1\),其他项是 \(0\)。即:

\[\\\sum_{k = m}^n \begin{Bmatrix} n \\ k\end{Bmatrix} \begin{bmatrix} k \\ m\end{bmatrix}(-1)^{n-k} =[m=n] \]

把公式 \(4\) 代入公式 \(1\) 同理,得到反转公式(公式 5、6):

\[\\\sum_{k = m}^n \begin{Bmatrix} n \\ k\end{Bmatrix} \begin{bmatrix} k \\ m\end{bmatrix}(-1)^{n-k} =[m=n] \\\sum_{k = m}^n \begin{bmatrix} n \\ k\end{bmatrix} \begin{Bmatrix} k \\ m\end{Bmatrix}(-1)^{n-k} =[m=n] \]


下面我们要做的事情是对负的 \(n,m\) 定义斯特林数,这么做无疑对代数运算有好处。

我们可以根据递推式得到以下结论(斯特林的对称性):

\[\begin{Bmatrix} n \\ k\end{Bmatrix} = \begin{bmatrix} -k \\ -n\end{bmatrix} \\ \begin{bmatrix} n \\ k\end{bmatrix} = \begin{Bmatrix} -k \\ -n\end{Bmatrix} \]

证明?证明?不会。

这也叫广义斯特林数。


我们来证几个常用斯特林恒等式来做练习。

顺便一提,求和符号的上下界我都写上去了,实际上不写也可以根据斯特林/组合数限制得到。

附加公式 \(1\)

\[\begin{Bmatrix} n+1 \\ m+1\end{Bmatrix}=\sum_{k = m}^n {n\choose k}\begin{Bmatrix} k \\ m\end{Bmatrix} \]

证明:可以通过组合意义得到,\(n + 1\) 个元素分到 \(m + 1\) 个子集,枚举 \(n + 1\) 和哪些元素在一个子集,剩下的元素划分成 \(m\) 个子集。

附加公式 \(2\)

\[\begin{bmatrix} n+1 \\ m+1\end{bmatrix}=\sum_{k = m}^n \begin{bmatrix} n \\ k\end{bmatrix} {k\choose m} \]

证明:可以通过组合意义得到,\(n + 1\) 个元素分成 \(m + 1\) 个轮换,枚举前 \(n\) 个形成了几个轮换,然后选择 \(m\) 个保持不动,剩下的轮换同 \(n + 1\) 串起来。假了。不管了。

附加公式 \(3\)

斯特林的容斥式,考虑枚举多少个集合为空。

\[{\begin{Bmatrix} n \\ m\end{Bmatrix}} = \frac{1}{m!} \sum_{i = 0}^m (-1)^i {m \choose i} (m - i)^n \]


啥玩意都能反演,斯特林行不行?当然行。比如给定:

\[g(n) = \sum_{i = 0}^{n} \begin{Bmatrix} n \\ i\end{Bmatrix} f(i) \]

\[f(n) = \sum_{i = 0}^n [n=i]f(i) \\=\sum_{i = 0}^n \left(\sum_{k = 0}^n \begin{bmatrix} n \\ k\end{bmatrix}\begin{Bmatrix} k \\ i\end{Bmatrix} (-1)^{n-k}\right) f(i) \\=\sum_{k = 0}^n (-1)^{n-k} \begin{bmatrix} n \\ k\end{bmatrix}\left( \sum_{i = 0}^n\begin{Bmatrix} k \\ i\end{Bmatrix}f(i)\right) \\=\sum_{k = 0}^n (-1)^{n-k} \begin{bmatrix} n \\ k\end{bmatrix} g(k) \]

上面的推导使用了反转公式。

类似地,我们可以得到两个斯特林反演公式:

\[g(n) = \sum_{i = 0}^{n} \begin{Bmatrix} n \\ i\end{Bmatrix} f(i) \Longrightarrow f(n)=\sum_{i = 0}^n (-1)^{n-i} \begin{bmatrix} n \\ i\end{bmatrix} g(i) \]

\[g(n) = \sum_{i = 0}^{n} \begin{bmatrix} n \\ i\end{bmatrix} f(i) \Longrightarrow f(n)=\sum_{i = 0}^n (-1)^{n-i} \begin{Bmatrix} n \\ i\end{Bmatrix} g(i) \]


下面是一些基于多项式运算的斯特林:第一/二类斯特林数行/列。

第一类斯特林数 · 行

刚刚才学会了上升幂转通常幂:

\[x^{\overline n}=\sum_{k = 0}^n {} \begin{bmatrix} n \\ k\end{bmatrix} x^k \]

我们只需求出 \(x^{\overline n}\) 的多项式表达即可。

考虑倍增:

\[x^{\overline {2n}} = x^{\overline {n}} \cdot (x+n)^{\overline {n}} \]

如果碰到奇数就用 \(x^{\overline {n+1}} = x^{\overline {n}} (x + n)\) 暴力算一下。

问题转换为:已求出 \(f(x)\),如何快速得到 \(f(x + c)\)

\[f(x + c) = \sum_{i = 0}^{n} a_i (x + c)^n \\= \sum_{i = 0}^{n} a_i \sum_{j = 0}^i {i\choose j}x^j c^{i-j} \\= \sum_{j = 0}^n\dfrac{x^j}{j!} \sum_{i = j}^{n} a_i i!\dfrac{c^{i-j}}{(i-j)!} \]

「差一定」的卷积形式,reverse 后 NTT。

复杂度 \(T\left(n\right) = T\left(\dfrac{n}{2}\right) + \mathcal O(n \log n) = \mathcal O(n \log n)\)

第一类斯特林数 · 列

还记得 EGF(指数型生成函数)吗,不记得也没关系我们再推一遍:

\[A(x) = \sum_{i} a_i \dfrac{x^i}{i!},B(x) = \sum_{i} b_i \dfrac{x^i}{i!} \]

\[C(x) = A(x) B(x) = \sum_{i} c_i \dfrac{x^i}{i!} \\c_n = \sum_{i = 0}^n {n\choose i}a_i b_{n-i} \]

EGF 就是带组合数卷积。我们用 EGF 把轮换组合起来:

\[A(x) = \sum_{i = 1}^{\infty} (i-1)! \dfrac{x^i}{i!} \\{\begin{bmatrix} n \\ m\end{bmatrix}} = [x^n] \dfrac{A(x)^m}{m!} \]

这个式子非常好理解,\(i\) 个数组成 \(1\) 个轮换的方案数是 \((i-1)!\)。一个一个加入轮换,若加入后有 \(i\) 个元素,其中 \(j\) 个是新加入的,那么给新轮换分配位置的方案数是 \(i\choose j\) ,再乘上旧元素、新元素内部的方案数。最后除以 \(m!\) ,因为轮换没有标号,上面的方法认为是有序加入轮换。

时间复杂度 \(\mathcal O(n \log n)\),因为有加强版 exp 所以常数略大。

第二类斯特林数 · 行

有个非常常见的公式,很多中都出现过:

\[x^k = \sum_{i = 0}^x {\begin{Bmatrix} k \\ i\end{Bmatrix}} {x\choose i} i! \]

组合意义就是 \(k\) 个球放到 \(x\) 个盒子里的方案数,枚举 \(i\) 个盒子非空,选择 \(i\) 个盒子,并把 \(k\) 个球分到这 \(i\) 个盒子里。

\(f(x) = x^k,g(x)={\begin{Bmatrix} k \\ x\end{Bmatrix}} x!\),用一下二项式反演得到:

\[{\begin{Bmatrix} n \\ m \end{Bmatrix}} = \sum_{i = 0}^m \dfrac{(-1)^{m-i}}{(m-i)!} \dfrac{i^n}{i!} \]

NTT 即可。

第二类斯特林数 · 列

类似第一类斯特林数 · 列的做法,用组合意义去做:

\[A(x) = \sum_{i = 1}^{\infty} \dfrac{x^i}{i!} = e^x - 1 \\{\begin{Bmatrix} n \\ m\end{Bmatrix}} = [x^n] \dfrac{A(x)^m}{m!} \]

这个式子也非常好理解,\(i\) 个数组成 \(1\) 个集合的方案数是 \(1\)。一个一个加入集合,考虑卷积的意义,若加入后一共有 \(i\) 个元素,其中 \(j\) 个是新加入的,那么给新集合内部元素分配标号的方案数是 \(i\choose j\) ,再乘上旧、新集合内部的方案数。同样最后除以 \(m!\) ,因为上面的方法认为集合带标号。

据说还有倍增 + NTT的小常数一个 log 做法。暂且咕咕咕。

贝尔数 Bell

定义 \(B_n\) 表示把 \(n\) 个不同元素划分成若干集合的方案数。

递推公式:

\[B_{n + 1}= \sum_{k = 0}^n {n \choose k} B_k \]

考虑 \(n + 1\) 和哪些元素在一个集合即可得出该公式。

和第二类斯特林数的关系:\(B_n\)等于第二类斯特林数第\(n\)行之和

\[B_n = \sum_{i = 0}^n {\begin{Bmatrix} n \\ i \end{Bmatrix}} \]

快速求 Bell 数

\(F(x)\) 表示非空集合的指数生成函数,\(G(x)\) 表示答案生成函数。

枚举划分成了多少个集合可以得到:

\[G(x) = \sum_{i = 0}^{\infty} \dfrac{F(x)^i}{i!} = e^{F(x)} \]

除以 \(i!\) 是因为 EGF 的乘法是有序组合,而集合不带标号。

又很显然,\(i\) 个元素构成一个集合方案唯一,得到:

\[F(x) = \sum_{i = 1}^{\infty} \dfrac{x^i}{i!} = e^x - 1 \]

\[G(x) = e^{e^x - 1} \]

多项式 exp 即可。

练习题

几道斯特林水题。

P4827 [国家集训队] Crash 的文明世界

题意:

\[S(u) = \left(\sum_{i = 1}^n \mathrm{dis}(u,i)^k\right)\bmod 10007 \]

\(S(1),S(2),...,S(n)\)\(n\leq 5\times 10^4,k\leq 150\)

题解:

有个简单的公式:

\[x^k = \sum_{i = 0}^k {\begin{Bmatrix} k \\ i\end{Bmatrix}} {x\choose i} i! \]

组合意义就是 \(k\) 个球放到 \(x\) 个盒子里的方案数,枚举 \(i\) 个盒子非空,选择 \(i\) 个盒子,并把 \(k\) 个球分到这 \(i\) 个盒子里。

我们化式子得到:

\[S(u) = \sum_{j = 0}^k j!{\begin{Bmatrix} k \\ j\end{Bmatrix}} \sum_{i = 1}^n {\mathrm{dis}(i,u) \choose j} \]

于是我们对于每个 \(u\) 的每个 \(j\) 用 dp 求一下后面那个 $\sum_{i = 1}^n {\mathrm{dis}(i,u) \choose j} $。

转移根据组合数的递推转移。即 \(u\) 有个儿子 \(x\),那么 \(x\) 子树内的答案就是:

\[\sum_{i \in \mathrm{subtree(v)}}{\mathrm{dis}(i,u) \choose j} \\=\sum_{i \in \mathrm{subtree(v)}}{\mathrm{dis}(i,u)-1 \choose j-1} + {\mathrm{dis}(i,u)-1 \choose j} \\=\sum_{i \in \mathrm{subtree(v)}}{\mathrm{dis}(i,v) \choose j-1} + {\mathrm{dis}(i,v) \choose j} \]

还要考虑子树外的贡献,换根 dp 即可。

CF1097G Vladislav and a Great Legend

题意:

给定一棵树,用 \(f(S)\) 表示 \(S\) 这个集合的点构成的生成树所含边的个数,求:

\[\left(\sum_{S\subseteq \{1,2,...,n\},S\not = \varnothing} f(S)^k\right) \bmod (10^9 + 7) \]

\(n\leq 10^5,k\le 200\)

题解:

先像上一题那样转换成:

\[\sum_{i = 1}^k i!{\begin{Bmatrix} k \\ i\end{Bmatrix}} \sum_{S} {f(S) \choose i} \]

于是我们要求 \(f(S) \choose i\),组合意义就是:对于每一个点集组成的生成树,在树里面选出 \(i\) 条边涂色的方案数。

很显然是背包了,为了方便,我们用 \(f[u][x]\) 表示 \(S\) 集合的点构成的生成树是以 \(u\) 为根的非空连通块,连通块染 \(i\) 条边的方案数。

转移总体思路就是背包转移:\(f[u][x] \leftarrow f[u][y] \times f[u][x - y]\),但有一些细节,见下方 dfs 代码:

void dfs(int u, int fa = 0) {
   f[u][0] = 2; //u可以选或不选
   sz[u] = 1;
   rep(e, 0, (int) G[u].size() - 1) {
      int v = G[u][e];
      if(v == fa) continue ;
      dfs(v, u);
      static int t[K]; // t[i]表示在v中有选点的情况下,u为根连通块i条边染色的方案数
      rep(i, 0, k) t[i] = 0;
      per(x, min(sz[u] - 1, k), 0) per(y, min(sz[v] - 1, k - x), 0) { //取min保证复杂度
         int val = 1ll * f[u][x] * f[v][y] % mod;
         upd(t[x + y], val); //u-v 边不染色
         upd(t[x + y + 1], val); // u-v 边染色
      }
      rep(i, 0, k) upd(f[u][i], t[i]); // 不在v中选点方案是f[u][i],在v中选点方案是t[i]
      rep(i, 0, k) {
         upd(ans[i], mod - f[v][i]);
         upd(ans[i + 1], mod - f[v][i]); // 只有v子树有选点, u不选的方案应从答案中减去
      }
      sz[u] += sz[v];
   }
   upd(f[u][0], mod - 1); //没选点不行
   rep(i, 1, k) upd(ans[i], f[u][i]); //在生成树的根处累计答案
}

注意时间复杂度 \(\mathcal O(nk)\),可以通过分类子树大小证明。

CF960G Bandit Blues

一句话题解:[FJOI2016]建筑师 套个 第一类斯特林数 · 行 板子。

题意:

求大小为 \(n\) 的排列个数,满足前缀最大值和后缀最大值分别有 \(A,B\) 个。

\(n\leq 10^5\)

题解:

我们把前缀 max 或后缀 max 的位置 标记,容易发现恰有 \(A+B-1\) 个点被标记,并且同时是后缀 max 和前缀 max 的只有 \(n\) 所在位置,\(n\) 的左边打的都是前缀 max 标记,\(n\) 的右边打的都是后缀 max 标记,\(n\) 是分水岭。

我们看 \(n\) 左边这一半排列(不含 \(n\)),这个排列可以看做若干段,每段是前缀 max 标记点 + 后面紧接的比它小数。容易发现一个段恰好对应一个轮换(圆排列):从轮换中最大的点开始展开这个轮换。

现在有 \(A+B-2\) 个段,由 \(1,2,...,n-1\) 构成,方案数就是第一类斯特林数,再乘个组合数表示每个段放左边还是右边。一旦确定每个段在哪边,这个排列就确定了,因为我们要按每个段首项从小到大排序,依次放到排列中。

答案就是:

\[{A+B-2\choose A-1}{\begin{bmatrix}n - 1 \\ A+B-2\end{bmatrix}} \]

CF961G Partitions

题意:给定 \(n\) 个元素,权值为 \(w_1,w_2,...,w_n\)。定义集合的权值 \(W(S) = \sum_{x\in S} w_x\),,划分的权值是 \(W(R) = \sum_{S} W(S)\)。求所有 \(k\) 集合划分的权值和 \(\bmod {10^9 + 7}\)

题解:

一开始推了一个 MTT + 第一类斯特林数 · 行 + 分治NTT 的式子,显然不是正解。

考虑 \(W(S)\) 的组合意义:集合内每个点的权值都加上 \(w_x\),划分的权值就是所有点权值和。

我们分开考虑每个 \(w_x\) 的贡献次数。对自己每种方案都有贡献,贡献次数是 \({\begin{Bmatrix} n \\ k\end{Bmatrix}}\)。对其他 \(n - 1\) 个元素贡献相同,都是 \(\begin{Bmatrix} n-1 \\ k\end{Bmatrix}\),即其他元素先分成 \(k\) 个集合,\(w_x\) 再加入要贡献的点所在集合。

最后的答案就是:

\[\left(\sum_{i = 1}^n w_x\right) \left({\begin{Bmatrix} n \\ k\end{Bmatrix}} + (n-1){\begin{Bmatrix} n-1 \\ k\end{Bmatrix}}\right) \]

斯特林数可以用容斥式暴力求:

\[{\begin{Bmatrix} n \\ m\end{Bmatrix}} = \frac{1}{m!} \sum_{i = 0}^m (-1)^i {m \choose i} (m - i)^n \]

posted @ 2020-08-07 22:58  hfhongzy  阅读(44)  评论(0编辑  收藏  举报