1. 第一类斯特林数

1.1. 定义与递推式

\(\text{s}(n,m)\) 表示将 \(n\) 个互异的数划分成 \(m\) 个无标号的圆排列的方案数("无标号" 也就是圆排列互不区分)。

\[\text{s}(n,m)=\text{s}(n-1,m-1)+(n-1)\cdot \text{s}(n-1,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_n(x)=x\cdot F_{n-1}(x)+(n-1)\cdot F_{n-1}(x) \]

所以从 \(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\)

\[(-x)^\overline n=\sum_{i=0}^n \text{s}(n,i)\cdot (-1)^i\cdot x^i \]

由于 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,m)=\text{S}(n-1,m-1)+m\cdot \text{S}(n-1,m) \]

边界是 \(\text{S}(n,0)=[n=0]\).

2.2. 普通幂转上升幂、下降幂

观察 \(x^n\) 的组合意义:对于 \(n\) 个互异元素,将每个元素染成 \(x\) 种颜色中的一种的方案数。

我们还可以这样考虑:枚举最终染的颜色数 \(k\),在 \(x\) 种颜色中选择 \(k\) 种,计算将 \(n\) 个元素划分成 \(k\) 个带标号 非空 集合的方案数。这个方案数实际上就是 \(\text{S}(n,k)\cdot k!\).

所以

\[x^n=\sum_{k=0}^{\min\{x,n\}}\binom{x}{k}\cdot k!\cdot \text{S}(n,k)=\sum_{k=0}^{\min\{x,n\}}x^{\underline k}\cdot \text{S}(n,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. 性质一

\[x^\underline n=\frac{x!}{(x-n)!} \]

3.1.2. 性质二

\[\binom{n}{k}\cdot k^\underline m=\binom{n-m}{k-m}\cdot n^\underline m \]

这个柿子有啥用处呢?一般情况下,\(n\) 为已知,\(k,m\) 都是枚举量,所以前面的柿子是妥妥的平方复杂度。但是如果进行转换,将 \(m\) 放在第一个循环枚举,此时 \(n^{\underline m}\) 就可以放在第一个循环,而组合数可以利用一些恒等变换快速计算。从而降低复杂度。当然,我从来没有实践过

3.1.3. 性质三

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

其它的东西可能就随缘更了,不知道还有没有机会(别立 \(\rm flag\) 啊。

4. 经典例题

Crash 的文明世界

\[\begin{aligned}\text{Ans}_x&=\sum_{i=1}^n \text{dis}^k(i,x)\\&=\sum_{i=1}^n \sum_{j=0}^k \binom{\text{dis}(i,x)}{j}\cdot \text{S}(k,j)\cdot j!\\&=\sum_{j=0}^k \text{S}(k,j)\cdot j!\sum_{i=1}^n \binom{\text{dis}(i,x)}{j}\\&=\sum_{j=0}^k \text{S}(k,j)\cdot j!\sum_{i=1}^n \left(\binom{\text{dis}(i,x)-1}{j}+\binom{\text{dis}(i,x)-1}{j-1} \right)\end{aligned} \]

\(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}\) 即可。

posted on 2022-04-05 16:58  Oxide  阅读(440)  评论(0编辑  收藏  举报