斯特林数

第二类斯特林数

  • 记为 \(\begin{Bmatrix} n\\k\end{Bmatrix}\),或者 \(S(n,k)\)

  • 表示将 \(n\) 个两两不相同的元素分成若干的非空集合的方案数

递推式

\[S(n,k)=S(n-1,k-1)+kS(n-1,k) \]

\[S(n,0)=[n=0] \]

通项公式

\[S(n,m)=\sum_{i=0}^m \frac{(-1)^{m-i}i^n}{i!(m-i)!} \]

  • 证明考虑二项式反演

  • \(G_i\) 表示 \(n\) 个不相同的物品放在 \(i\) 个不同集合中,允许有空集的方案数

  • \(F_i\) 表示 \(n\) 个不相同的物品放在 \(i\) 个 不同集合中,不允许有空集的方案数

\[G_i=n^i\\ G_i=\sum_{j=0}^i \binom{i}{j} F_j \]

  • 那么二项式反演后,因为原本的意思是集合是没有区分的,那么 \(F_i\)\(S(n,i)\)\(i!\)

  • 那么最后的结果就是最上面的那个式子

  • 对应的,有这样一个式子

\[n^m=\sum_{i=0}^n S(m,i)i!\binom{n}{i} \]

  • 组合意义就是 \(m\) 个有标号物品放在 \(n\) 个有标号的盒子的方案数

  • 通过这个式子,可以求自然数幂和

\[S(n)=\sum_{i=1}^n i^k \]

  • 把后面的用斯特林数表示

\[S(n)=\sum_{j=0}^k S(k,j)*j!*\binom{n+1}{j+1} \]

同一行的第二类斯特林数的计算

  • 同一行指的是 \(n\) 相同
  1. 通项公式卷积 \(O(n\log n)\)

  2. 利用 EGF (应该不常用)

第一类斯特林数

  • 记为 \(\begin{bmatrix}n\\k \end{bmatrix}\),或者 \(s(n,k)\)

  • 表示将 \(n\) 个元素分成 \(k\) 个非空轮换的方案数

递推式

\[s(n,k)=s(n-1,k-1)+(n-1)s(n-1,k) \]

\[s(n,0)=[n=0] \]

通项公式

  • 好像没有实用的

同一行的第一类斯特林数的计算

  • 表示有关的生成函数 \(F_n=\sum_{i=0}^n s(n,i) x^i\)

  • 根据递推公式可以推出:

\[F_n(x)=\prod_{i=0}^{n-1}(x+i) =\frac{(x+n-1)!}{(x-1)!} \]

  • 这个东西就是 \(x\)\(n\) 次上升幂

  • 对于这个的预处理,考虑 \(F_{2n}(x)=F_n(x)F_{n}(x+n)\)

  • 那么通过 \(F_n(x)\) 求出 \(F_n(x+n)\) 后卷起来就可以了

\[F_{n}(x+n)=\sum_{i=0}^n s(n,i) (x+n)^i \]

  • 将后面那个东西二项式展开

\[F_{n}(x+n)=\sum_{j=0}^n \frac{x^j}{j!}\sum_{i=j}^n s(n,i)*i!*\frac{n^{i-j}}{(i-j)!} \]

  • 后面的部分是一个减法卷积,把一个多项式反过来就可以卷起来了

  • 还有一个更实用的方法,直接分治 NTT 对于这 \(n\) 个多项式卷起来,就是先卷左边再卷右边,最后合并两端的多项式,复杂度为 \(O(n\log^2 n )\)

同一列的第一类斯特林数的计算

  • 单个轮换的 EGF 是

\[F(x)=\sum_{i=1}^n\frac{(i-1)!}{i!}x^i=\sum_{i=1}^n\frac{x}{i} \]

  • 它的 \(k\) 次幂就是 \(s(i,k)\)

  • 对于 \(k\) 次幂可以先取 \(\ln\) ,然后 \(\exp\)

应用

  • 非常神奇的是这个 markdown 的上划线一直不显示,所以对于显示不出来的 markdown 用中文标注了

上升幂和普通幂的相互转化

\[x^{\overline{m}}(上划线) =\sum_{k}s(m,k) x^k \]

\[x^m =\sum_{k} S(m,k)(-1)^{m-k}x^{\overline{k}} \]

下降幂和普通幂的相互转化

\[x^m=\sum_k s(m,k) x^{\underline{k}} \]

\[x^{\underline{m}} (下划线)=\sum_k S(m,k)(-1)^{m-k}x^k \]

斯特林反演

  • 如果有

\[f(n)=\sum_{i=0}^n \begin{Bmatrix}n\\ i\end{Bmatrix} g(i) \]

  • 那么

\[g(n)=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}f(i) \]

  • 还有一种形式

\[f(i)=\sum_{j=i}^n \begin{Bmatrix}j\\ i\end{Bmatrix} g(j) \]

  • 那么

\[g(i)=\sum_{j=i}^n (-1)^{j-i}\begin{bmatrix}j\\i\end{bmatrix} f(j) \]

例题
CF961G Partitions

  • 对于一个 \(W(S)=|S|\sum_{x\in S}w_x\) ,实际上集合中的每个数都对集合中的每个数做了一个贡献,那么我们考虑对于一个数会有多少的贡献
  • 对于 \(j\)\(i\) 的贡献显然是它们在一个集合的方案数,再加上 \(i\) 自己对自己的贡献,那么对于一个数的贡献其实是 \(s(n,k)+(n-1)s(n-1,k)\) ,用通向大力算就可以了

CF960G Bandit Blues

  • 对于最大值前面和后面都没有比自己更大的,所以以最大值为分界点

  • \(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 )\)

P4091 [HEOI2016/TJOI2016]求和

  • 因为 \(S(i,j)=0,j>i\),所以式子可以写成:

\[\begin{aligned} f(n)&=\sum_{i=0}^n \sum_{j=0}^n S(i,j)\times 2^j\times j!\\ &=\sum_{j=0}^n 2^j j! \sum_{i=0}^n S(i,j) \\ &=\sum_{j=0}^n 2^j j!\sum_{i=0}^n \sum_{k=0}^ j \frac{(-1)^k(j-k)^i}{k!(j-k)!} \\ &=\sum_{j=0}^n 2^j j!\sum_{k=0}^ j \frac{(-1)^k \sum_{i=0}^n (j-k)^i}{k!(j-k)!} \\ \end{aligned} \]

  • 那么将后面的这个东西卷起来就可以了,复杂度 \(O(n\log n)\)
posted @ 2022-06-04 10:33  kzos  阅读(93)  评论(0)    收藏  举报