学习笔记第十六节:斯特林数

正题

      百度:“

      在组合数学,Stirling数可指两类数,第一类Stirling数和第二类Stirling数,都是由18世纪数学家James Stirling提出的。

      ”

      其实就是两个东西:

      1.第一类斯特林数s(n,k),表示把n个数放进不分种类的k个圆中的排列数。

      明显s(n,k) 的递推式是s(n,k)=s(n-1,k-1)+(n-1)*s(n-1,k)

      s(n-1,k-1)表示的是前n-1个排列成k-1个圆后,第n个自己成为一个独立的圆。

      (n-1)*s(n-1,k)表示的是前n-1个排列成k个园后,第n个插入到前n-1中任意一个的后面。

      这是很明显的.

      2.第二类斯特林数S(n,k),表示把n个数放进不分种类的k个箱子中的排列数。(需要保证箱子非空)

      明S(n,k)=S(n-1,k-1)+(k-1)*S(n,k-1)

      解释和第一类斯特林数的差不多。

      不同点在于

      理解好就可以理解两种数。

      现在先讨论第二类斯特林数的性质和通项公式。

      首先有几个很特殊的性质:

      学习笔记第十六节:斯特林数_第1张图片

      其实都很好理解:

      第一条和第二条很好懂,特别的0^0=1,尽管这并不严谨。

      第三条就是只有两个箱子,把球放进去,每个球有两种选择,而每个状态会重复算两遍,再减去其中一个为空的状态,就是2^{n-1}-1

      第四条很好懂。

      第五条考虑取出两个球,将它们放在同一个箱子,而剩下的球刚好放在剩下的箱子,所以就是C(n,2)

      第六条考虑两种状态,第一种,一个箱子里面有3个球,第二种,两个箱子里面各有两个球。

      前者很明显,状态数是C(n,3);后者先取出4个球,然后剩下的球放进剩下的箱子里面,这四个球有三种分配方法去放进2个箱子里面(因为箱子相同

      所以发现状态数等于C(n,3)+3*C(n,4)

      剩下的就是通项公式:

      S(n,m)=\frac{1}{m!}\sum_{k=0}^m (-1)^kC(m,k)*(m-k)^n


      updata_19.5.13:

      发现证明并不需要那么麻烦,学了二项式反演之后,整个事情变得很简单:

      m^n=\sum_{k=0}^m P_m^k*S(n,k),这个式子很显然,k枚举的是非空盒子数量,然后由于是m^n,所以对盒子顺序有要求。

      接着把组合数系数化出来,m^n=\sum_{k=0}^mC_m^kk!S(n,k)

      n不变,发现前面的式子的值跟m有关系,后面k!S(n,k)的值只跟k有关系。

      根据公式:f(n)=\sum_{k=0}^nC_n^kg(k)\Leftrightarrow g(n)=\sum_{k=0}^n (-1)^{n-k}C_n^kf(k)

      可以得到S(n,m)m!=\sum_{k=0}^m (-1)^{m-k}C(m,k)k^n

      移项,改变枚举对象可以得到:S(n,m)=\frac{1}{m!}\sum_{k=0}^m (-1)^kC(m,k)*(m-k)^n


      证明如下:

      1.首先考虑将\frac{1}{m!}去掉,因为相当于箱子的去重,先给箱子标上号。

      2.其次考虑有h个空盒的状态一共有多少个?我们把它设为G(h),那么>=0个空盒的总和就等于\sum_{h=0}^{m}G(h),也等于m^n,因为也是将每一个状态都算了一遍。

      3.考虑空盒>=k时,我们需要计算的状态数。首先,先选出k个空盒,其次,将n个小球放进m-k个箱子里面,那么就一共有C(m,k)*(m-k)^n种情况。

      4.其中,一个空盒数为h的状态,一共被算了C(h,k)遍,因为相当于从h个空盒里面选出k个空盒,然后剩下的唯一状态。

      5.所以,C(m,k)*(m-k)^n=\sum_{h=k}^{m}C(h,k)*G(h)

      6.那么,加一个(-1)^k次方,可以得到:

      学习笔记第十六节:斯特林数_第2张图片

      7.很明显可以发现G(0)=m!*S(n,m),因为有标号而且全不为空。

      所以\sum_{k=0}^m(-1)^kC(m,k)*(m-k)^n=m!*S(n,m)

      变化一下就是:S(n,m)=\frac{1}{m!}\sum_{k=0}^m (-1)^kC(m,k)*(m-k)^n

      证明说完了.

      现在说一下怎么快速求。

      递推公式很明显需要n^2,但是可以发现它其实是满足FFT的、或者NTT的。

      因为

      学习笔记第十六节:斯特林数_第3张图片

      所以设F(i)=\frac{1}{i!},Q(i)=\frac{i^n}{i!}

      S(n)=F*Q,所以用n \log n的时间就可以求出S(n,0)\to S(n,n)的每一项。    

你可能感兴趣的:(学习笔记)