斯特林数

第一类斯特林数\(s_{n,m}\)

组合意义:

\(n\)个不同数划分为\(m\)个圆排列的方案数

递推公式:

\[s_{i,j}=s_{i-1,j-1}+(i-1)\times s_{i-1,j} \]

与阶乘关系:

\[\sum_{i=0}^ns_{n,i}=n! \]

意义就是一个圆排列可以看做一个置换,所有排列的方案就是\(n!\)

与上升幂的关系:

\[m^{\overline{n}}=\sum_{i=0}^ns_{n,i}\times m^i \]

证明:数学归纳法

快速求法:

行:

\(O(n\log^2n)\)的做法

考虑构造第一类斯特林数的生成函数

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

分治\(NTT\)直接乘起来就好了,第\(m\)项系数就是\(s_{n,m}\)

列:

待填


第二类斯特林数\(S_{n,m}\)

组合意义:

\(n\)个不同数划分为\(m\)个相同集合(集合非空,并且相同)的方案数

递推公式:

\[S_{i,j}=S_{i-1,j-1}+j\times S_{i-1,j} \]

一个重要公式:

\[n^m=\sum _{i=0}^mS_{m,i}i!\dbinom{n}{i} \]

直接考虑组合意义,\(n^m\)表示将\(m\)个不同的数放入\(n\)个不同集合(可空)的方案数,直接枚举放入多少个不可空的集合即可

与下降幂的关系:

根据上面公式和\(\dbinom{n}{i}i!=n^{\underline{i}}\)可得

\[n^m=\sum_{i=0}^mS_{m,i}n^{\underline{i}} \]

快速求法:

行:

考虑公式\(n^m=\sum _{i=0}^mS_{m,i}i!\dbinom{n}{i}\),对其进行二项式反演得

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

展开二项式并移项得

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

列:

待填


反转公式

首先考虑两类斯特林数可将常幂,上升幂,下降幂联系起来

\[\begin{array}{l} x^{\bar{n}}=\sum_{i=0}^{n} s_{n, i} x^{i} \\ x^{n}=\sum_{i=0}^{n} S_{n, i} x^{\underline{i}} \end{array} \]

然后注意到上升幂和下降幂也有一定联系

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

我们将\((10)\)式中的两个式子两边都乘上一个\((-1)^n\),就可以得到下面两个式子

\[\begin{aligned} x^{n} &=\sum_{i=0}^{n} S_{n, i}(-1)^{n-i} x^{\bar{i}} \\ x^{\underline{n}} &=\sum_{i=0}^{n} s_{n, i}(-1)^{n-i} x^{i} \end{aligned} \]

如果将上面式子中\(x^{\bar{i}}\)\(x^i\)分别用第一类斯特林数和第二类斯特林数展开,可以得到反转公式

\[\begin{array}{l} \sum_{i=m}^{n} S_{n, i} s_{i, m}(-1)^{n-i}=[n=m] \\ \sum_{i=m}^{n} s_{n, i} S_{i, m}(-1)^{n-i}=[n=m] \end{array} \]

一个经典问题

计算\(n\)个点\(m\)条边的无向连通图的方案数

\(O(n^6)\)的做法

考虑设\(f_{n,m}\)表示\(n\)个点\(m\)条边的无向连通图的方案数,转移拿所有的方案减去不合法的方案,考虑直接枚举\(1\)号点所在连通图的点数和边数,剩下的随便选,即

\[f_{n,m}=\binom{\binom{n}{2}}{m}-\sum_{i=1}^n\sum_{j=1}^mf_{i,j}\binom{\binom{n-i}{2}}{m}\binom{n-1}{i-1} \]

\(O(n^5)\)的做法

考虑一个比较套路的做法,我们设一个\(f_{k}\)表示\(n\)个点,随意划分成\(k\)个集合,满足只有在相同集合内的点有边,不同集合中不会有边,并且边数恰好为\(m\)的方案数

我们考虑一个有\(x\)的联通块的图会在一个\(f_k\)中被计算到\(S_{x,k}\)次,所以考虑使用上面的反转公式

\[\sum_{i=1}^nS_{n,i}(i-1)!(-1)^{i-1}=[n=1] \]

所以如果我们求一个\(\sum_{i=1}^nf_{k}(k-1)!(-1)^{k-1}\)就可以得到所有\(n\)个点\(m\)条边的连通图的方案数

那么剩下的就是考虑怎么计算这个\(f_k\)了,考虑\(DP\),设\(g_{n,c,e}\)表示\(n\)个点划分成了\(c\)个集合一共有\(e\)条边的方案数,这里我们在转移的时候强制每个集合都是连成完全图,最后假设有\(e\)条边,那么直接从中间选出\(m\)条边就好了,也就是直接乘一个组合数即可,转移同样也是枚举\(1\)号点所在集合转移即可

\[g_{n,c,e}=\sum_{i=1}^n\binom{n-1}{i-1}g_{n-i,c-1,e-\binom{i}{2}} \]

所以最后答案就是\(\sum_{i=1}^n\sum_{j=m}^{\binom{n}{2}}g_{n,i,j}(j-1)!(-1)^{j-1}\binom{j}{m}\)

\(O(n^4)\)的做法

考虑优化\(O(n^5)\)的做法,如果我们能让一个划分成\(k\)个集合的方案被计算到\((k-1)!\)次,那么我们就可以在\(DP\)的时候不用记录一个\(c\)

要做到这个其实只需要在\(DP\)转移的时候不枚举\(1\)所在的联通块,而是枚举任意一个联通块就好了,那么对于一个划分成\(k\)个集合的方案就会被算到\(k!\)次了,那么如果是\((k-1)!\)次,只需要在最后枚举下\(1\)所在的联通块计数,那么一个联通块就会被计算\((k-1)!\)次了,对于\((-1)^{j-1}\),可以直接在\(DP\)转移的时候乘一个\(-1\)的系数就好了,那么最后转移式就是

\[g_{n,e}=\sum_{i=1}^n(-1)\times\binom{n}{i}g_{n-i,e-\binom{i}{2}} \]

那么最后答案就是\(\sum_{i=1}^n\sum_{j=\binom{i}{2}}^{\binom{n}{2}}\binom{j}{m}\binom{n-1}{i-1}g_{n-i,j-\binom{i}{2}}\)

斯特林反演

咕咕咕

posted @ 2020-06-01 08:20  Roal_L  阅读(306)  评论(0编辑  收藏  举报