斯特林数
第一类斯特林数
第一类斯特林数s(n,k)
定义为下面公式的系数:
xn_=n∑k=0s(n,k)xk定义无符号斯特林数为:
c(n,k)=[nk]=|s(n,k)|可以利用下面公式通过无符号斯特林数计算有符号斯特林数:
s(n,k)=(−1)n−kc(n,k)无符号斯特林数满足:
x¯n=n∑k=0c(n,k)xk无符号斯特林数的递推关系为:
[n+1k]=n[nk]+[nk−1]有符号斯特林数的递推公式为:
s(n+1,k)=−ns(n,k)+s(n,k−1)无符号斯特林数的组合意义是:将n个元素分成k个环(都不空)的方案数为 [nk]
生成函数
对于给定的n,设F(n)为第一类斯特林数的生成函数,即 F(n)i=[ni] 。由于无符号斯特林数满足:
x¯n=n∑k=0c(n,k)xk因此可以直接得到:
F(n)(x)=x¯n=n−1∏i=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+n−1)Fn−1(x),else我们可以用倍增算法来解决。下面给出计算F(n)(x+n)的方法:
F(n)(x+n)=n∑i=0F(n)i(x+n)i=n∑i=0xin∑j=iF(n)jnj−i(ji)=n∑i=0xin∑j=iF(n)jnj−ij!i!(j−i)!=n∑i=01i!xin∑j=i[F(n)jj!][nj−i(j−i)!]可以看出后面项是等差卷积,可以用FFT直接得到。
总的时间复杂度为
T(n)=T(n2)+O(nlog2n)=O(nlog2n)第二类斯特林数
第二类斯特林数 {nk} 的定义为下面公式的系数:
xn=n∑k=0{nk}xk_第二类斯特林数的递推公式为:
{n+1k}=k{nk}+{nk−1}第二类斯特林数的直接计算公式为:
{nk}=1k!k∑i=0(−1)i(ki)(k−i)n第二类斯特林数 {nk} 的可以用来表示将n个元素拆分成k个非空子集的方法数。
根据定义可以发现下面公式的成立:
n∑m=0(nm){mk}=(k+1){nk+1}+{nk}生成函数
对于某个n,以及所有0≤k≤n计算 {nk} ,可以利用快速卷积在 O(nlog2n) 的时间复杂度内实现。
观察下面第二类斯特林数的直接计算公式:
{nk}=1k!k∑i=0(−1)i(ki)(k−i)n=k∑i=0(−1)i(k−i)n1i!(k−i)!=k∑i=0[(−1)i1i!][(k−i)n1(k−i)!]记第二类斯特林数的生成函数为F, Fk={nk} 那么我们可以推出F是另外两个多项式的卷积:
F(x)=[n∑i=0(−1)i1i!]×[n∑i=0in1i!]因此利用快速卷积算法就可以得到第二类斯特林数的生成函数。
斯特林反演
反演内容:
f(n)=n∑k=0{nk}g(k)⇔g(n)=n∑k=0s(n,k)f(k)=n∑k=0(−1)n−k[nk]f(k)以及反转公式:
n∑k=m(−1)n−k[nk]{km}=[m=n]n∑k=m(−1)n−k{nk}[km]=[m=n]