1. 第一类斯特林数
1.1. 定义与递推式
\(\text{s}(n,m)\) 表示将 \(n\) 个互异的数划分成 \(m\) 个无标号的圆排列的方案数("无标号" 也就是圆排列互不区分)。
边界是 \(\text{s}(n,0)=[n=0]\).
注:对于每个圆排列,插入数字的方案就是其大小,所以系数是 \((n-1)\).
1.2. 上升幂、下降幂转普通幂
构造第 \(n\) 行第一类斯特林数的生成函数 \(F_n(x)=\sum_{i=0}^n \text{s}(n,i)\cdot x^i\). 那么有
所以从 \(F_0(x)=1\) 开始累乘可以得到 \(F_n(x)=\prod_{i=0}^{n-1}(x+i)=x^\overline n\),称为 \(x\) 的 \(n\) 次上升阶乘幂。
现在我们得到 \(x^\overline n=\sum_{i=0}^n \text{s}(n,i)\cdot x^i\),不妨代入 \(-x\) 得
由于 3.1.3. 性质三
,我们可以得到 \(x^\underline n=\sum_{i=0}^n (-1)^{n-i}\cdot \text{s}(n,i)\cdot x^i\).
1.3. 一些题目
例 1.
\(\text{HDU - 4372 Count the Buildings}\)
题目描述:有 \(n\) 栋楼,请问将其排列有多少种方案使得从左边看有 \(a\) 栋楼,从右边看有 \(b\) 栋楼。保证所有楼房高度 互不相同。
不妨先找到最高的那栋楼,它可以天然地将序列分成两个部分:左部能看到 \(a-1\) 栋楼,右部能看到 \(b-1\) 栋楼。
只考虑左部,发现每栋能看见的楼是单增的,我们把能看见的楼和它后面紧跟的不能被看见的楼看作一坨(这是为了不重不漏)。那么对于大小为 \(m\) 的坨,内部方案是 \((m-1)!\).
现在考虑将 \(n-1\) 个数分成 \(a-1+b-1\) 坨,再用组合数选择 \(a-1\) 个放在左部。问题是,怎么 "分坨"?这和大小有关啊!事实上,你会发现这个方案数就是第一类斯特林数,问题就解决了!
2. 第二类斯特林数
2.1. 定义与递推式
\(\text{S}(n,m)\) 表示将 \(n\) 个互异的数划分成 \(m\) 个无标号的非空集合的方案数。
边界是 \(\text{S}(n,0)=[n=0]\).
2.2. 普通幂转上升幂、下降幂
观察 \(x^n\) 的组合意义:对于 \(n\) 个互异元素,将每个元素染成 \(x\) 种颜色中的一种的方案数。
我们还可以这样考虑:枚举最终染的颜色数 \(k\),在 \(x\) 种颜色中选择 \(k\) 种,计算将 \(n\) 个元素划分成 \(k\) 个带标号 非空 集合的方案数。这个方案数实际上就是 \(\text{S}(n,k)\cdot k!\).
所以
事实上,我们可以把 \(\min\{x,n\}\) 的范围改写成 \(n\),因为当 \(k>x\) 时,下降幂为零。
普通幂转上升幂的操作和上面一毛一样(但是就不能用组合意义理解了,不过我也懒得再证明了),可以得到 \(x^n=\sum_{k=0}^n (-1)^{n-k}\cdot \text{S}(n,k)\cdot x^\overline k\).
3. 下降幂
3.1. 基础性质
3.1.1. 性质一
3.1.2. 性质二
这个柿子有啥用处呢?一般情况下,\(n\) 为已知,\(k,m\) 都是枚举量,所以前面的柿子是妥妥的平方复杂度。但是如果进行转换,将 \(m\) 放在第一个循环枚举,此时 \(n^{\underline m}\) 就可以放在第一个循环,而组合数可以利用一些恒等变换快速计算。从而降低复杂度。当然,我从来没有实践过。
3.1.3. 性质三
其它的东西可能就随缘更了,不知道还有没有机会(别立 \(\rm flag\) 啊。
4. 经典例题
Crash 的文明世界
记 \(dp(x,i)\) 为 \(x\) 子树内所有节点 \(y\) 对应的 \(\displaystyle\binom{\text{dis}(y,x)}{i}\) 之和,于是可以进行递推:\(\displaystyle dp(x,i)=\sum_{v\in \tt{son}}dp(v,i)+dp(v,i-1)\),最后再做个换根 \(\tt{dp}\) 即可。