Stirling数小记


定义/组合意义

第一类斯特林数:[nm]表示n个不同元素分为m个圆排列的方案数

有标号的第一类斯特林数s(n,m)=(1)nm[nm]

第二类斯特林数:{nm}表示n个不同元素分为m个集合的方案数

注意圆排列和集合都是相互之间无序的

 

递推方法

第一类斯特林数

[nm]=[n1m1]+(n1)[n1m]

即新建一个圆排列,或者插入前面n1个元素中任意一个的后面

显然的,有标号的第一类斯特林数递推式就是

[nm]=[n1m1](n1)[n1m]

 

第二类斯特林数

{nm}={n1m1}+m{n1m}

即新建一个集合,或者加入前面的m个集合

 

第二类斯特林数的通项公式

{nm}=1m!i=0(1)mi(mi)in

其组合意义是枚举生成了多少个有序的集合,然后容斥,最后除去集合的顺序

 

生成函数表示与行/列求解

固定n,以m为形式幂指数,则第一类斯特林数的普通生成函数

OGF=i=0n1(x+i)=xn¯

(其意义就是上面的递推公式)

倍增+卷积二项展开求出F(x+i)即可做到O(nlogn)求出一行

 

固定m,以n为形式幂指数,则第一类斯特林数的指数型生成函数

EGF=1m!(i=1(i1)!i!xi)m=1m!(i=1xii)m

F(x)=i=1xii

F(x)=i=1xi1=11x F(x)=11x=ln(1x) EGF=1m!(ln(1x))m=1m!(1)mlnm(1x)

(就是百度百科上的那个,它什么都没讲清楚)

多项式快速幂即可做到O(nlognnlog2n)求一列

 

而在上式的推导过程中额外加入(1)m的常数,并且把xi换成(x)i可以得到有标号第一类斯特林数的指数型生成函数

EGF=1m!(i=1(x)ii)m=1m!lnm(1+x)   

第二类斯特林数的一行可以直接由通项公式做卷积得到

 

固定m,以n为形式幂指数,则第二类斯特林数的指数型生成函数表示为

EGF=1m!(i=1xii!)m=1m!(ex1)m=1m!i=0m(1)m1(mi)eix

实际上由这个二项展开的形式也可以发现,它就是上面通项公式的生成函数推导

可以求一列,复杂度为O(nlognnlog2n)常数很大

 

虽然没什么意义,但是还是写一下二元形式

第一类斯特林数:

EGF=eln(1x)y

第二类斯特林数:

EGF=e(ex1)y

注意元x为指数型,y是普通型

 

斯特林数与幂指数/上升幂/下降幂

第一类斯特林数:

上面已经说过xn¯=i=0n[ni]xi

同理,用有标号的第一类斯特林数将xn_展开的式子是

xn_=i=0n(1)ni[ni]xi  

第二类斯特林数:

类似通项公式的求解,组合意义将幂指数展开,视xn为将n个元素随意放在x个位置,则枚举x个位置中那些被选择

xn=i=0n(xi)i!{ni}

(xi)i!写成下降幂的形式,得到优美的式子

xn=i=0n{ni}xi_  

而实际上由上式二项反演也可以得到通项公式

{nm}=1m!i=0(1)mi(mi)in

关于下降幂多项式的快速转化,可以再借鉴这个

 

斯特林变换/斯特林反演

对于斯特林变换

an=i=0n{ni}bi

A(x),B(x)为数列a,b的指数型生成函数,带入前文推导的式子,则得到上式的生成函数表达就是

A(x)=B(ex1)

显然得到B(x)=A(ln(x+1)),而ln(x+1)显然转化为有标号的第一类斯特林数

因此得到斯特林反演的表达形式是

bn=i=0n(1)ni[ni]ai

(不大可能搞类似多项式复合的方法处理这个反演吧,最多可能也就是求一个位置)