斯特林数 (Stirling Number) 是两组数列, 其与上升幂,下降幂多项式密切相关, 也广泛用于组合问题中.
第一类斯特林数
定义
定义(无符号)第一类斯特林数, 表示 (n) 个有标号元素分为 (k) ((k le n)) 个无标号环排列 (翻转算两种) 的方案数.
记做 ({n rack k}), 或者 (c(n,k)), (|s(n,k)|), (left|s_n^k
ight|).
枚举最后一个元素的位置, 容易得到递推式
有符号的斯特林数可以表示为
它的定义是这样的:
首先定义 (n) 次下降幂和上升幂
容易发现这是一个常数项为 (0) 的 (n) 次多项式. 那么可以定义
求法... 待更
性质... 待更
第二类斯特林数
定义
定义第二类斯特林数, 表示 (n) 个有标号元素分为 (k) ((k le n)) 个无标号非空集合的方案数.
记做 ({n race k}), 或者 (S(n,k)).
同样的, 可以得到递推式:
第二类斯特林数也有关于下降幂/上升幂的定义:
求法
我们显然有一个 (O(n^2)) 的递推求法.
但有时我们想求出单点的值, 或者求出 (S(n,k), k in {0,1,dotsc, n}) 的所有值, 那么就需要更快的算法.
设 (S'(n,k)) 表示 (n) 个有标号元素分为 (k) 个有标号非空集合的方案数, 显然有
设 (g(n,k)) 表示 (n) 个有标号元素分为 (k) 个有标号可空集合的方案数, 还有
枚举非空集合的个数, 可以发现
二项式反演:
那么就可以求出 (S(n,k)):
这样, 我们就可以在 (O(n)) 的时间复杂度内求出 (S(n,k));
容易发现这是一个卷积, 直接FFT即可求出 (S(n,k), k in {0,1,dotsc, n}), 时间复杂度 (O(n log n)).
Note a:
求出来的 (S(n,k)) 的表达式在 (n < k) 时也是正确的! 这时它的值为 (0).
当 (n < k) 时, ((1)) 式可以看作
也就是说, (S'(n,i) (n<i)) 的值自然为0. 那么反演出来的式子自然也可以保证 (S'(n,i) = 0(n<i)), 即 (S(n,i) = 0(n<i)).
Note b:
定义 (0^0 = 1).
性质
...待更