斯特林数

Published: by Creative Commons Licence

  • Tags:

第一类斯特林数

第一类斯特林数s(n,k)

定义为下面公式的系数:

xn_=nk=0s(n,k)xk

定义无符号斯特林数为:

c(n,k)=[nk]=|s(n,k)|

可以利用下面公式通过无符号斯特林数计算有符号斯特林数:

s(n,k)=(1)nkc(n,k)

无符号斯特林数满足:

x¯n=nk=0c(n,k)xk

无符号斯特林数的递推关系为:

[n+1k]=n[nk]+[nk1]

有符号斯特林数的递推公式为:

s(n+1,k)=ns(n,k)+s(n,k1)

无符号斯特林数的组合意义是:将n个元素分成k个环(都不空)的方案数为 [nk]

生成函数

对于给定的n,设F(n)为第一类斯特林数的生成函数,即 F(n)i=[ni] 。由于无符号斯特林数满足:

x¯n=nk=0c(n,k)xk

因此可以直接得到:

F(n)(x)=x¯n=n1i=0(x+i)

乘积符号内是n个多项式,我们可以用分治+FFT在O(n(log2n)2)时间复杂度内计算得到。下面介绍用倍增+FFT在O(nlog2n)的算法。

容易发现下面公式成立:

F(n)(x)={F(n2)(x)F(n2)(x+n2),2|n(x+n1)Fn1(x),else

我们可以用倍增算法来解决。下面给出计算F(n)(x+n)的方法:

F(n)(x+n)=ni=0F(n)i(x+n)i=ni=0xinj=iF(n)jnji(ji)=ni=0xinj=iF(n)jnjij!i!(ji)!=ni=01i!xinj=i[F(n)jj!][nji(ji)!]

可以看出后面项是等差卷积,可以用FFT直接得到。

总的时间复杂度为

T(n)=T(n2)+O(nlog2n)=O(nlog2n)

第二类斯特林数

第二类斯特林数 {nk} 的定义为下面公式的系数:

xn=nk=0{nk}xk_

第二类斯特林数的递推公式为:

{n+1k}=k{nk}+{nk1}

第二类斯特林数的直接计算公式为:

{nk}=1k!ki=0(1)i(ki)(ki)n

第二类斯特林数 {nk} 的可以用来表示将n个元素拆分成k个非空子集的方法数。

根据定义可以发现下面公式的成立:

nm=0(nm){mk}=(k+1){nk+1}+{nk}

生成函数

对于某个n,以及所有0kn计算 {nk} ,可以利用快速卷积在 O(nlog2n) 的时间复杂度内实现。

观察下面第二类斯特林数的直接计算公式:

{nk}=1k!ki=0(1)i(ki)(ki)n=ki=0(1)i(ki)n1i!(ki)!=ki=0[(1)i1i!][(ki)n1(ki)!]

记第二类斯特林数的生成函数为FFk={nk} 那么我们可以推出F是另外两个多项式的卷积:

F(x)=[ni=0(1)i1i!]×[ni=0in1i!]

因此利用快速卷积算法就可以得到第二类斯特林数的生成函数。

斯特林反演

反演内容:

f(n)=nk=0{nk}g(k)g(n)=nk=0s(n,k)f(k)=nk=0(1)nk[nk]f(k)

以及反转公式:

nk=m(1)nk[nk]{km}=[m=n]nk=m(1)nk{nk}[km]=[m=n]