两类斯特林数的整理

定义

第一类斯特林数(又称轮换数,by zzh),表示将\(n\)个不同的数分成\(k\)个无标号圆排列的方案数,用\(\begin{bmatrix}n\\k\end{bmatrix}\)表示,根据定义有如下递推式:

\[\begin{bmatrix}n\\k\end{bmatrix}=\begin{bmatrix}n-1\\k-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\k\end{bmatrix}\]

边界条件为\(\begin{bmatrix}0\\0\end{bmatrix}=1\)

第二类斯特林数(又称集合数,by zzh),表示将\(n\)个不同的数分成\(k\)个无标号集合的方案数,用\(\begin{Bmatrix}n\\k\end{Bmatrix}\)表示,根据定义有如下递推式:

\[\begin{Bmatrix}n\\k\end{Bmatrix}=\begin{Bmatrix}n-1\\k-1\end{Bmatrix}+k\begin{Bmatrix}n-1\\k\end{Bmatrix}\]

边界条件为\(\begin{Bmatrix}0\\0\end{Bmatrix}=1\)

性质与快速求解

我们往往只需要求解一行或一列的斯特林数,而上面两个递推式复杂度都是\(O(n^2)\),不甚理想,我们需要利用它们的一些优秀性质进行快速求解。

按照从易到难的顺序进行求解。

第二类斯特林数·行

考虑组合意义,我们可以写出以下两个式子:

\[k^n=\sum_{i=0}^k\dbinom ki\begin{Bmatrix}n\\i\end{Bmatrix}i!\]

\[k!\begin{Bmatrix}n\\k\end{Bmatrix}=\sum_{i=0}^k(-1)^{k-i}\dbinom kii^n\]

\(k^n\)可以理解为将\(n\)个有标号的物品放到\(k\)个有标号的盒子里,其中可以有盒子为空的方案数。我们考虑枚举哪些盒子为空,那么这两个式子是显然的。

值得注意的是,式子中的\(\sum_{i=0}^k\)可以替换成\(\sum_{i=0}^n\),因为当\(i>n\)时有\(\begin{Bmatrix}n\\i\end{Bmatrix}=0\),而当\(i>k\)时又有\(\dbinom ki=0\),所以\(i\)只需要枚举到\(min(n,k)\),当然枚举到\(n\)\(k\)的任意一个都是可以的。

细心一点可以发现,这两个式子其实就是\(k!\begin{Bmatrix}n\\k\end{Bmatrix}\)\(k^n\)构成的二项式反演关系。

捎带的,我们可以利用\(EGF\)证一下这个反演:

展开组合数,有

\[\frac{k^n}{k!}=\sum_{i=0}^k\frac{\begin{Bmatrix}n\\i\end{Bmatrix}}{i!}*\frac1{(k-i)!}\]

\[\begin{Bmatrix}n\\k\end{Bmatrix}=\sum_{i=0}^n\frac{(-1)^{k-i}}{(k-1)!}*\frac{i^n}{i!}\]

\(P_n(x)\)\(\{i^n\}\)\(EGF\)\(S_n(x)\)\(\{i!\begin{Bmatrix}n\\i\end{Bmatrix}\}\)\(EGF\),那么根据两式可分别推出

\[P_n(x)=S_n(x)*e^x\]

\[S_n(x)=P_n(x)*e^{-x}\]

所以两式等价。

那么求法就很显然了:我们很容易求解\(P_n(x)\)\(e^{-x}\)的前\(n+1\)项,那么把它们卷起来就可以得到\(S_n(x)\)了。

第一类斯特林数·行&第二类斯特林数·列

观察最初的递推式,你就会知道为什么这两个会有共同的方法了。不过你马上也会知道了

通过递推式入手(顺便放了一个组合数以供对比参考):

\[\dbinom nk=\dbinom{n-1}{k-1}+\dbinom{n-1}k\]

\[\begin{bmatrix}n\\k\end{bmatrix}=\begin{bmatrix}n-1\\k-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\k\end{bmatrix}\]

\[\begin{Bmatrix}n\\k\end{Bmatrix}=\begin{Bmatrix}n-1\\k-1\end{Bmatrix}+k\begin{Bmatrix}n-1\\k\end{Bmatrix}\]

\(C_n(x)\)表示\(\{\dbinom nk\}的\)OGF\(,\)\(s_n(x)\)表示\(\{\begin{bmatrix}n\\i\end{bmatrix}\}\)\(OGF\)\(S_k(x)\)表示\(\{\begin{Bmatrix}i\\k\end{Bmatrix}\}\)\(OGF\)(注意和行的区别),则有

\[C_n(x)=xC_{n-1}(x)+C_{n-1}=(1+x)C_{n-1}(x)=(1+x)^n\]

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

\[S_k(x)=xS_{k-1}(x)+kxS_k(x)=\frac{xS_{k-1}}{1-kx}=\frac{x^k}{\prod_{i=1}^k(1-ix)}\]

这里可以看出第一类斯特林数其实就是展开上升幂之后对应项的系数。

然后就得到了两个分治\(ntt\)的做法。

不过第一个可以优化(第二个不知道行不行):在分治\(ntt\)的过程中,如果我们求出了上述式子的左边,我们可以想办法用左边去表示出右边来,而不用再递归下去。

具体的,假如我们求出了左边\(s_m(x)=x^{\overline m}\),那么右边其实就是\(s_m(x+m)=(x+m)^{\overline m}\),对\(s_m(x)\)\(s_m(x+m)\)做卷积即可得到\(s_{2m}(x)\)。顺带一提,有时候分治下去会碰到长度是奇数的情况,那么我们只需要让\(s_{2m}(x)\)与二项式\((x+2m)\)暴力乘起来就可以得到\(s_{2m+1}(x)\)

尝试对\(s_m(x+m)\)进行展开:

\[s_m(x+m)=\sum_{i=0}^m\begin{bmatrix}m\\i\end{bmatrix}(x+m)^i\]

\[=\sum_{i=0}^m\begin{bmatrix}m\\i\end{bmatrix}\sum_{j=0}^i\dbinom ijx^jm^{i-j}\]

\[=\sum_{i=0}^m\frac{x^i}{i!}\sum_{j=i}^m\begin{bmatrix}m\\j\end{bmatrix}j!*\frac{m^{j-i}}{(j-i)!}\]

把右边式子中的\(\begin{bmatrix}m\\j\end{bmatrix}j!\)翻转一下,就可以得到一个卷积的形式,也就求出了\(s_m(x+m)\)的各项系数,与\(s_m(x)\)卷一下就可以得到\(s_{2m}(x)\)。复杂度由分治降到了倍增。

第一类斯特林数·列&第二类斯特林数·列

你有没有发现,前面三个东西里面就二列是两个\(log\)的?

所以它理应有更好的算法。

我们从另一个角度考虑斯特林数的组合意义:

可以发现,两类斯特林数都可以看做是某个东西的标号组合,一类是圆排列,二类是集合。那么,我们设\(s_k(x)\)表示\(\{\begin{bmatrix}i\\k\end{bmatrix}\}\)\(EGF\)\(S_k(x)\)表示\(\{\begin{Bmatrix}i\\k\end{Bmatrix}\}\)\(EGF\)(前面是\(OGF\)),\(a(x)\)表示圆排列的\(EGF\)\(A(x)\)表示集合的\(EGF\),则有

\[a(x)=\sum_{i=1}^\infty\frac{x^i}i=ln(\frac1{1-x})\]

\[A(x)=\sum_{i=1}^\infty\frac {x^i}{i!}=e^x-1\]

\[s_k(x)=\frac{a(x)^k}{k!}\]

\[S_k(x)=\frac{A(x)^k}{k!}\]

\(s_k(x)\)\(S_k(x)\)都除掉阶乘的原因是因为直接用圆排列或集合的\(EGF\)\(k\)次方的话含义是有\(k\)不同的圆排列或集合的组合,而斯特林数的定义中圆排列或集合是不带标号的,所以要除掉\(k!\)

这样就可以在多项式快速幂的时间内求出两类斯特林数某一列的前\(n\)项。

综上,全部四种情况的斯特林数均可在\(O(nlogn)\)时间内求出,只不过常数越来越大。

扩展

斯特林反演

\[f_n=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}g_i\iff g_n=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix}n\\i\end{bmatrix}f_i\]

不会证。

贝尔数

定义为将\(n\)个不同的数分成若干个无标号集合的方案,即\(\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\)

看上去可以带到上面那个反演式子里面,然而并没有什么卵用。

贝尔数是集合的任意标号组合,集合的\(EGF\)就是上面的\(A(x)=e^x-1\),那么贝尔数的\(EGF\)就是\(exp(A(x))=exp(e^x-1)\)。我们接下来将从两方面来说明\(exp\)的含义,也就是它为什么代表任意标号组合。

\(F(x)\)为某种单个组合方案数的\(EGF\)(比如上面的集合),\(G(x)\)为对这种单个组合再任意标号组合方案数的\(EGF\)(比如上面的贝尔数就是集合的组合)。

首先是直接从定义式展开:

\[exp(F(x))=\sum_{i=0}^\infty \frac{F(x)^i}{i!}\]

可以看出,\(i\)个单个组合对应的贡献就是\(\frac{F(x)^i}{i!}\),而\(G(x)\)是单个组合的任意标号组合,所以就是把它们全部加起来。如果这个单个组合就是集合,那么\(\frac{F(x)^i}{i!}\)就是上面讲到的第二类斯特林数,而\(exp(F(x))\)是第二类斯特林数的和,也就是贝尔数。

另一方面,我们可以枚举第一个物品放在多大的单个组合中,列出这样一个\(dp\)式子:

\[g_n=\sum_{i=1}^n\dbinom{n-1}{i-1}f_ig_{n-i}+[n=0]\]

\[\frac{g_n}{(n-1)!}=\sum_{i=1}^n\frac{f_i}{(i-1)!}\frac{g_{n-i}}{(n-i)!}\]

这样就得到了一个卷积的形式。我们发现\(\sum_{i=0}^\infty g_{i+1}\frac{x^i}{i!}\)其实就是\(G(x)'\),同理\(\sum_{i=0}^\infty f_{i+1}\frac{x^i}{i!}\)就是\(F(x)'\),那么就可以写成:

\[G(x)'=G(x)F'(x)\]

\[\frac{G(x)'}{G(x)}=F'(x)\]

\[ln(G(x))+C=F(x)-f_0+C\]

由于一般情况下\(f_0=0\)(就算不等于\(0\)也可以强制让它变成\(0\),因为\(f_0\)根本不会对答案有贡献),所以可以去掉常数\(C\)

\[ln(G(x))=F(x)\]

\[G(x)=exp(F(x))\]

得到了同样的结果。

以此类推,森林的\(EGF\)也是树的\(exp\),沙漠的\(EGF\)也是仙人掌的\(exp\),第一类斯特林数的和——阶乘也是圆排列的\(exp\),这也是为什么上面写的圆排列的\(EGF\)\(ln(\frac1{1-x})\)

多项式\(exp\)的另一个用途是与多项式求\(ln\)组合应用,将多项式乘法转换成多项式加法,比如多项式快速幂和orzdkw,这里不细说了。

应用

1、求有\(a\)个前缀最大值和\(b\)个后缀最大值的\(n\)阶排列个数,\(n\leq10^5\)

每个前缀最大值和身后比它小的连续区间构成一个等价于圆排列的东西——都是固定一个数字,对其它数字做普通排列得到的结果。后缀最大值同理。那么问题就转换成有\(n-1\)个数字构成\(a+b-2\)个圆排列(最大值不参与构成圆排列)且选出\(a-1\)个圆排列放到最大值前面的方案,那么答案显然就是

\[\begin{bmatrix}n-1\\a+b-2\end{bmatrix}\dbinom{a+b-2}{a-1}\]

随便怎么求了。

2、求\(\sum_{i=0}^m\dbinom mii^n,n\leq10^5,m\leq10^9\)

\(i^n\)用第二类斯特林数代换掉:

\[Ans=\sum_{i=0}^m\dbinom mi\sum_{j=0}^n\dbinom ij\begin{Bmatrix}n\\j\end{Bmatrix}j!\]

\[=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}i!\sum_{j=0}^m\dbinom mj\dbinom ji\]

\[=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}\dbinom mii!\sum_{j=i}^m\dbinom{m-i}{j-i}\]

\[=\sum_{i=0}^n\begin{Bmatrix}n\\i\end{Bmatrix}2^{m-i}m^{\underline i}\]

求出所有\(\begin{Bmatrix}n\\i\end{Bmatrix}\)即可。

3、求\(\sum_{i=0}^m\dbinom mif(i)\)\(f(i)\)是一个\(n\)次多项式,\(m\leq10^9,n\leq10^5\)

可以看出,这个题严格比上一题难。

借鉴上一题的思路,我们想办法把答案凑成一个下降幂的形式。

\(\{g_i\}\)为满足\(f(x)=\sum_{i=0}^ng_ix^{\underline i}\)的一组解,也就是把一个普通多项式\(f(x)\)转成了一个下降幂多项式。这样的话,我们就可以用\(\{g_i\}\)代替第二类斯特林数,并依照上一题的方法求出答案:

\[Ans=\sum_{i=0}^m\dbinom mif(i)\]

\[=\sum_{i=0}^m\dbinom mi\sum_{j=0}^ng_j\dbinom ijj!\]

\[=\sum_{i=0}^ng_i2^{m-i}m^{\underline i}\]

所以问题转换成如何求\(\{g_i\}\)

观察这个式子:

\[f(x)=\sum_{i=0}^ng_ix^{\underline i}=\sum_{i=0}^ng_i\dbinom xii!\]

和第二类斯特林数·行那里提到的一个问题一样,因为当\(i>n\)\(g_i=0\)\(i>x\)\(\dbinom xi=0\),所以\(j\)同样可以枚举到\(x\)\(n\)的任意一个,同时拆开组合数,就有

\[\frac{f(x)}{x!}=\sum_{i=0}^xg_i*\frac1{(x-i)!}\]

\(F(x)\)\(\{f{(i)}\}\)\(EGF\)\(G(x)\)\(\{g_i\}\)\(OGF\),有

\[F(x)=G(x)*e^x\]

\[G(x)=F(x)*e^{-x}\]

因为\(G(x)\)只有前\(n+1\)项有值,所以我们只要求出\(F(x)\)的前\(n+1\)项,也就是所有的\(f(i),i\in[0,n]\),这个可以多点求值做。

要注意\(f(x)\)表示的是一个多项式\(f\)\(x\)处的取值,而不代表生成函数。如果不好理解,可以在形式上把\(f(i)\)换成\(f_i\),这样\(F(x)\)就是\(\{f_i\}\)\(EGF\),看起来方便一些。

4、给定一个\(n*m\)的矩阵,用\(c\)个不同的数字填满整个矩阵使得任意两行互不相同,任意两列互不相同,求方案数。\(n,m\leq5000\)

首先钦定\(n\)是一个常数。

如果只让行互不相同的话,方案数就是\((c^m)^{\underline n}\),设其为\(g_m\)

\(f_m\)表示行列都分别互不相同时的方案数,则有

\[g_m=\sum_{i=0}^m\begin{Bmatrix}m\\i\end{Bmatrix}f_i\]

上式的含义就是将\(m\)列分成\(i\)个集合,因为一个集合内部的列是相同的,所以可以把集合看成一列,方案数就是\(f_i\)

根据斯特林反演,有

\[f_m=\sum_{i=0}^m(-1)^{m-i}\begin{bmatrix}m\\i\end{bmatrix}g_i\]

直接暴力即可,复杂度瓶颈在于如何求\(g_i\),所以斯特林数求得再快也没意义了。

转载于:https://www.cnblogs.com/star-city/p/11067126.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值