抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

最近在 CF 上出现了一道斯特林数 (Stirling Number) 的题(CF960G, HDU 上 有解法相同的一道题),(在 ZJOI Day1 讲课的时候也提到了)。

所以先来总结一波公式。

文中所用记号

组合数 (nm)\binom{n}{m} 不用讲了吧。

定义 xx 的 nn 阶下降幂 xn‾=∏i=0n−1(x−i)x ^ {\underline{n}} = \prod_{i = 0}^{n - 1} (x - i),当 xx 为正整数时就等于 AxnA_{x} ^ {n},A 就是排列数。
xx 的 nn 阶上升幂 xn‾=∏i=0n−1(x+i)x ^ {\overline{n}} = \prod_{i = 0} ^ {n - 1} (x + i)。

定义 [xi]f(x)[x ^ i]f(x) 为多项式 f(x)f(x) 中 xix ^ i 项前的系数。

则易证 [xi]xn‾=(−1)n−i[xi]xn‾[x ^ i]x ^ {\underline{n}} = (-1) ^ {n - i} [x ^ i]x ^ {\overline{n}}

第一类 Stirling 数

定义

定义第一类 Stirling 数 [nm]\left[ {n \atop m} \right] 或 s(n,m)s(n, m) (0≤m≤n0 \le m \le n):

[nm]=s(n,m)={[n−1m−1]+[n−1m]×(n−1),m<n1,m=n0,m=0,n≠0\left[ {n \atop m} \right] = s(n, m) = \begin{cases} \left[ {n - 1 \atop m - 1} \right] + \left[ {n - 1 \atop m} \right] \times (n - 1), & m < n \\ 1, & m = n \\ 0, & m = 0, n \ne 0 \end{cases}

组合意义:将 nn 个点组成 mm 个有向环的方案数(考虑第一个点独立成环,或插入到原有环的某个地方)。

一些性质

[n0]=0,[n1]=(n−1)!,∑i=1n[ni]=n!\left[ {n \atop 0} \right] = 0, \\ \left[ {n \atop 1} \right] = (n - 1)!, \\ \sum_{i = 1}^{n} \left[ {n \atop i} \right] = n!

最后一项可以由其组合意义得到。

将递推式后面一项展开,可以得到

[nm]=∑i[n−im−1](n−1i−1)(i−1)!=∑i[n−im−1](n−1)!(n−i)!=∑i[n−im−1](n−1)i−1‾\left[ {n \atop m} \right] = \sum_{i} \left[ {n - i \atop m - 1} \right] \binom{n - 1}{i - 1} (i - 1)! \\ = \sum_{i} \left[ {n - i \atop m - 1} \right] \frac {(n - 1)!} {(n - i)!} \\ = \sum_{i} \left[ {n - i \atop m - 1} \right] (n - 1)^{\underline{i - 1}}

也说明了其组合意义。

计算

根据递推式计算是 O(n2)O(n ^ 2) 的 , 考虑如何优化。

观察 xn‾x ^ {\overline{n}} 的各项系数:

首先可以发现 x ^ \overline{n} = (x + n - 1) \times x ^ {\overline{n - 1}} = x \times x ^ {\overline{n - 1}} + (n - 1) \times x ^ {\overline{n - 1}} (n \ge 1).
则 [xi]xn‾=[xi−1]xn−1‾+(n−1)[xi]xn−1‾ [x ^ i]x ^ {\overline{n}} =[x ^ {i - 1}]x ^ {\overline{n - 1}} + (n - 1) [x ^ i]x ^ {\overline{n - 1}}
显然有 [x0]xn‾=0,[xn]xn‾=1[x ^ 0]x ^ {\overline{n}} = 0, [x ^ n]x ^ {\overline{n}} = 1

观察发现,它与第一类 Stirling 数的定义相同。即 [xi]xn‾=[ni][x ^ i]x ^ {\overline{n}} = \left[ {n \atop i} \right].

而上升幂可以用两两合并 FFT 在 O(nlog⁡2n)O(n \log ^ 2 n) 内计算,那么我们就得到了 O(nlog⁡2n)O(n \log ^ 2 n) 的解法。

然而这玩意还能继续优化(虽然从常数意义来说不一定优):

首先假设 nn 为偶数(如果是奇数最后手动乘一项)。

假设我们已经知道了 xn2‾x ^ {\overline{\frac{n}{2}}} 的各项系数,记 fi=[xi]xn2‾f_i = [x ^ i]x ^ {\overline{\frac{n}{2}}}。

则 xn‾=xn2‾×(x+n2)n2‾ x ^ {\overline{n}} = x ^ {\overline{\frac{n}{2}}} \times (x + \frac{n}{2}) ^ {\overline{\frac{n}{2}}}

所以我们只需要知道 (x+n2)n2‾(x + \frac{n}{2}) ^ {\overline{\frac{n}{2}}} 即可。

令 t=x+n2t = x + \frac{n}{2}, 则 (x+n2)n2‾=tn2‾ (x + \frac{n}{2}) ^ {\overline{\frac{n}{2}}} = t ^ {\overline{\frac{n}{2}}}

由二项式定理得 ti=(x+n2)i=∑j=0i(ij)xj(n2)i−jt ^ i = (x + \frac{n}{2}) ^ i = \sum_{j = 0} ^ {i} \binom{i}{j} x ^ j \left( \frac{n}{2} \right) ^ {i - j}

则

[xi](x+n2)n2‾=[xi]tn2‾=∑j=in2[tj]tn2‾×[xi]tj=∑j=in2fj(ji)(n2)j−i[x^i] (x + \frac{n}{2}) ^ {\overline{\frac{n}{2}}} = [x^i] t ^ {\overline{\frac{n}{2}}} \\ = \sum_{j = i} ^ {\frac{n}{2}} [t^j]{t ^ {\overline{\frac{n}{2}}}} \times [x^i]t^j \\ = \sum_{j = i} ^ {\frac{n}{2}} f_j \binom{j}{i} \left( \frac{n}{2} \right) ^ {j - i}

这又是一个卷积式,继续 FFT。总复杂度 T(n)=T(n2)+O(nlog⁡n)=O(nlog⁡n)T(n) = T(\frac{n}{2}) + O(n \log n) = O(n \log n)

第二类 Stirling 数

定义

定义第二类 Stirling 数 {nm}\{ {n \atop m} \} 或 S(n,m)S(n, m) (0≤m≤n0 \le m \le n):

{nm}={{n−1m−1}+m{n−1m},n<m1,n=m0,m=0,n≠0\left\{ {n \atop m} \right\} = \begin{cases} \left\{ {n - 1 \atop m - 1} \right\} + m\left\{ {n - 1 \atop m} \right\}, & n < m\\ 1, &n = m \\ 0, &m = 0, n \ne 0 \end{cases}

组合意义:将 n 个球分成 m 组的方案数(球有标号,分组没有标号,盒子非空)。(同样考虑第一个球的分组状况)

一些性质

{n0}=0{n1}={nn}=1\left\{ {n \atop 0} \right\} = 0 \\ \left\{ {n \atop 1} \right\} = \left\{ {n \atop n} \right\} = 1

根据其组合意义,还可以得到其它一些组合问题的解(可以参考《离散数学》)。

将 nn 个球放到 mm 个盒子中,球有标号 .

  1. 盒子有标号,盒子非空:m!{nm}m! \left\{ {n \atop m} \right\}
  2. 盒子没有标号,盒子可空:∑i=1m{nm}\sum_{i = 1}^{m} \left\{ {n \atop m} \right\}
  3. 盒子有标号,盒子可空:∑i=1m{ni}i!(mi)=∑i=1m{ni}mi‾=mn\sum_{i = 1}^{m} \left\{ {n \atop i} \right\} i! \binom{m}{i} = \sum_{i = 1}^{m} \left\{ {n \atop i} \right\} m ^ {\underline{i}} = m ^ n

其中最后一点说明,可以将乘方用下降幂形式表示。

( 根据前面的公式,其实第一类 Stirling 数也可以将下降幂用乘方表示。)

这一点的好处在于从 xn‾x ^ {\underline{n}} 变成 (x+1)n‾(x + 1) ^ {\underline{n}} 比将 xnx ^ n 变成 (x+1)n(x + 1) ^ n 方便(前者 O(1)O(1), 后者 O(n)O(n))。

计算

考虑第三个问题的组合意义,我们可以得到一个容斥的式子(从所有方案中减去有空盒子的方案,最后去除标号):

{nm}=1m!∑k=0m(−1)k(mk)(m−k)n=∑k=0m(−1)k1k!1(m−k)!(m−k)n\left\{ {n \atop m} \right\} = \frac{1}{m!} \sum_{k = 0} ^ m (-1) ^ k \binom{m}{k} (m - k) ^ n \\ = \sum_{k = 0}^m (-1) ^ k \frac{1}{k!} \frac{1}{(m - k)!} (m - k) ^ n

也是一个卷积式,继续 FFT。


Reference & Notes:

一些公式是从这里 找到的。(包括 Stirling 数 O(nlog⁡n)O(n \log n) 的计算方法,其中也有一些关于 Stirling 数的例题。)

《离散数学》中介绍了 Stirling 数的一些性质。

关于如何输入 Stirling 数,参考了 Wikipedia 相关词条的原代码,这里也给出。

1
2
\left[ {n \atop m} \right] 
\left\{ {n \atop m} \right\}

(我说,我怎么都把这种东西写了出来)