最近在 CF 上出现了一道斯特林数 (Stirling Number) 的题(CF960G, HDU 上 有解法相同的一道题),(在 ZJOI Day1 讲课的时候也提到了)。
所以先来总结一波公式。
文中所用记号
组合数 (mn) 不用讲了吧。
定义 x 的 n 阶下降幂 xn=∏i=0n−1(x−i),当 x 为正整数时就等于 Axn,A 就是排列数。
x 的 n 阶上升幂 xn=∏i=0n−1(x+i)。
定义 [xi]f(x) 为多项式 f(x) 中 xi 项前的系数。
则易证 [xi]xn=(−1)n−i[xi]xn
第一类 Stirling 数
定义
定义第一类 Stirling 数 [mn] 或 s(n,m) (0≤m≤n):
[mn]=s(n,m)=⎩⎪⎪⎨⎪⎪⎧[m−1n−1]+[mn−1]×(n−1),1,0,m<nm=nm=0,n=0
组合意义:将 n 个点组成 m 个有向环的方案数(考虑第一个点独立成环,或插入到原有环的某个地方)。
一些性质
[0n]=0,[1n]=(n−1)!,i=1∑n[in]=n!
最后一项可以由其组合意义得到。
将递推式后面一项展开,可以得到
[mn]=i∑[m−1n−i](i−1n−1)(i−1)!=i∑[m−1n−i](n−i)!(n−1)!=i∑[m−1n−i](n−1)i−1
也说明了其组合意义。
计算
根据递推式计算是 O(n2) 的 , 考虑如何优化。
观察 xn 的各项系数:
首先可以发现 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
显然有 [x0]xn=0,[xn]xn=1
观察发现,它与第一类 Stirling 数的定义相同。即 [xi]xn=[in].
而上升幂可以用两两合并 FFT 在 O(nlog2n) 内计算,那么我们就得到了 O(nlog2n) 的解法。
然而这玩意还能继续优化(虽然从常数意义来说不一定优):
首先假设 n 为偶数(如果是奇数最后手动乘一项)。
假设我们已经知道了 x2n 的各项系数,记 fi=[xi]x2n。
则 xn=x2n×(x+2n)2n
所以我们只需要知道 (x+2n)2n 即可。
令 t=x+2n, 则 (x+2n)2n=t2n
由二项式定理得 ti=(x+2n)i=∑j=0i(ji)xj(2n)i−j
则
[xi](x+2n)2n=[xi]t2n=j=i∑2n[tj]t2n×[xi]tj=j=i∑2nfj(ij)(2n)j−i
这又是一个卷积式,继续 FFT。总复杂度 T(n)=T(2n)+O(nlogn)=O(nlogn)
第二类 Stirling 数
定义
定义第二类 Stirling 数 {mn} 或 S(n,m) (0≤m≤n):
{mn}=⎩⎪⎪⎨⎪⎪⎧{m−1n−1}+m{mn−1},1,0,n<mn=mm=0,n=0
组合意义:将 n 个球分成 m 组的方案数(球有标号,分组没有标号,盒子非空)。(同样考虑第一个球的分组状况)
一些性质
{0n}=0{1n}={nn}=1
根据其组合意义,还可以得到其它一些组合问题的解(可以参考《离散数学》)。
将 n 个球放到 m 个盒子中,球有标号 .
- 盒子有标号,盒子非空:m!{mn}
- 盒子没有标号,盒子可空:∑i=1m{mn}
- 盒子有标号,盒子可空:∑i=1m{in}i!(im)=∑i=1m{in}mi=mn
其中最后一点说明,可以将乘方用下降幂形式表示。
( 根据前面的公式,其实第一类 Stirling 数也可以将下降幂用乘方表示。)
这一点的好处在于从 xn 变成 (x+1)n 比将 xn 变成 (x+1)n 方便(前者 O(1), 后者 O(n))。
计算
考虑第三个问题的组合意义,我们可以得到一个容斥的式子(从所有方案中减去有空盒子的方案,最后去除标号):
{mn}=m!1k=0∑m(−1)k(km)(m−k)n=k=0∑m(−1)kk!1(m−k)!1(m−k)n
也是一个卷积式,继续 FFT。
Reference & Notes:
一些公式是从这里 找到的。(包括 Stirling 数 O(nlogn) 的计算方法,其中也有一些关于 Stirling 数的例题。)
《离散数学》中介绍了 Stirling 数的一些性质。
关于如何输入 Stirling 数,参考了 Wikipedia 相关词条的原代码,这里也给出。
1 2
| \left[ {n \atop m} \right] \left\{ {n \atop m} \right\}
|
(我说,我怎么都把这种东西写了出来)