斯特林数
第二类斯特林数
-
记为 \(\begin{Bmatrix} n\\k\end{Bmatrix}\),或者 \(S(n,k)\)
-
表示将 \(n\) 个两两不相同的元素分成若干的非空集合的方案数
递推式
通项公式
-
证明考虑二项式反演
-
设 \(G_i\) 表示 \(n\) 个不相同的物品放在 \(i\) 个不同集合中,允许有空集的方案数
-
设 \(F_i\) 表示 \(n\) 个不相同的物品放在 \(i\) 个 不同集合中,不允许有空集的方案数
-
那么二项式反演后,因为原本的意思是集合是没有区分的,那么 \(F_i\) 是 \(S(n,i)\) 的 \(i!\) 倍
-
那么最后的结果就是最上面的那个式子
-
对应的,有这样一个式子
-
组合意义就是 \(m\) 个有标号物品放在 \(n\) 个有标号的盒子的方案数
-
通过这个式子,可以求自然数幂和
- 把后面的用斯特林数表示
同一行的第二类斯特林数的计算
- 同一行指的是 \(n\) 相同
-
通项公式卷积 \(O(n\log n)\)
-
利用 EGF (应该不常用)
第一类斯特林数
-
记为 \(\begin{bmatrix}n\\k \end{bmatrix}\),或者 \(s(n,k)\)
-
表示将 \(n\) 个元素分成 \(k\) 个非空轮换的方案数
递推式
通项公式
- 好像没有实用的
同一行的第一类斯特林数的计算
-
表示有关的生成函数 \(F_n=\sum_{i=0}^n s(n,i) x^i\)
-
根据递推公式可以推出:
-
这个东西就是 \(x\) 的 \(n\) 次上升幂
-
对于这个的预处理,考虑 \(F_{2n}(x)=F_n(x)F_{n}(x+n)\)
-
那么通过 \(F_n(x)\) 求出 \(F_n(x+n)\) 后卷起来就可以了
- 将后面那个东西二项式展开
-
后面的部分是一个减法卷积,把一个多项式反过来就可以卷起来了
-
还有一个更实用的方法,直接分治 NTT 对于这 \(n\) 个多项式卷起来,就是先卷左边再卷右边,最后合并两端的多项式,复杂度为 \(O(n\log^2 n )\)
同一列的第一类斯特林数的计算
- 单个轮换的 EGF 是
-
它的 \(k\) 次幂就是 \(s(i,k)\)
-
对于 \(k\) 次幂可以先取 \(\ln\) ,然后 \(\exp\)
应用
- 非常神奇的是这个 markdown 的上划线一直不显示,所以对于显示不出来的 markdown 用中文标注了
上升幂和普通幂的相互转化
下降幂和普通幂的相互转化
斯特林反演
- 如果有
- 那么
- 还有一种形式
- 那么
- 对于一个 \(W(S)=|S|\sum_{x\in S}w_x\) ,实际上集合中的每个数都对集合中的每个数做了一个贡献,那么我们考虑对于一个数会有多少的贡献
- 对于 \(j\) 对 \(i\) 的贡献显然是它们在一个集合的方案数,再加上 \(i\) 自己对自己的贡献,那么对于一个数的贡献其实是 \(s(n,k)+(n-1)s(n-1,k)\) ,用通向大力算就可以了
-
对于最大值前面和后面都没有比自己更大的,所以以最大值为分界点
-
设 \(dp(i,j)\) 表示排列为 \(i\) 的前缀最大值有 \(j\) 个的方案数
-
\(dp(i,j)=dp(i-1,j-1)+(i-1)dp(i-1,j)\) ,这个其实就是第一类斯特林数
-
那么 \(Ans=\sum_{i=1}^n S(i-1,a-1)S(n-i,b-1)\binom{n}{i}\)
-
考虑这个的组合意义,\(Ans=\sum_{i=1}^a S(n-1,a+b-2)\binom{a+b-2}{a-1}\)
-
剩下的难点就在于快速的求出第一类斯特林数了,分治 NTT 可以做到 \(O(n\log^2n )\)
- 因为 \(S(i,j)=0,j>i\),所以式子可以写成:
- 那么将后面的这个东西卷起来就可以了,复杂度 \(O(n\log n)\)