一.两类stirling数的定义及递推公式.
第一类stirling数:定义第一类stirling数S1(n,m)S_1(n,m)S1(n,m)表示nnn个有标号的球分成mmm个无标号的非空轮换的方案数.
这里的轮换定义为旋转同构但翻转不同构,也就是说1,2,3,41,2,3,41,2,3,4和2,3,4,12,3,4,12,3,4,1是同一个轮换,但1,2,3,41,2,3,41,2,3,4与4,3,2,14,3,2,14,3,2,1不是同一个轮换.
第一类stirling数的递推公式分为两种情况转移:
1.把最后一个球单独放在一个轮换中,方案数为S1(n−1,m−1)S_1(n-1,m-1)S1(n−1,m−1).
2.把最后一个球放在某个轮换的某个球之前,方案数为(n−1)S1(n−1,m)(n-1)S_1(n-1,m)(n−1)S1(n−1,m).
那么得到第一类stirling数递推公式:
S1(n,m)=S1(n−1,m−1)+(n−1)S1(n−1,m)
S_1(n,m)=S_1(n-1,m-1)+(n-1)S_1(n-1,m)
S1(n,m)=S1(n−1,m−1)+(n−1)S1(n−1,m)
第二类stirling数:定义第二类stirling数S2(n,m)S_2(n,m)S2(n,m)表示nnn个有标号的球分成mmm个无标号的非空集合的方案数.
与第一类stirling数类似的,第二类stirling数的递推公式同样分为两种情况转移:
1.把最后一个球单独放在一个集合中,方案数为S2(n−1,m−1)S_2(n-1,m-1)S2(n−1,m−1).
2.把最后一个球放在某个集合中,方案数为mS2(n−1,m)mS_2(n-1,m)mS2(n−1,m).
那么得到第二类stirling数递推公式:
S2(n,m)=S2(n−1,m−1)+mS2(n−1,m)
S_2(n,m)=S_2(n-1,m-1)+mS_2(n-1,m)
S2(n,m)=S2(n−1,m−1)+mS2(n−1,m)
二.球与盒子的问题.
球与盒子的问题指的是将nnn个球放入mmm个盒子的计数问题,主要根据球有无标号,盒有无标号,是否可以有空盒分为888种情况.
接下来我们一一讨论这888种情况的解决方案.
情况1:球无标号,盒有标号,不允许空盒.
插板法,答案为(n−1m−1)\binom{n-1}{m-1}(m−1n−1).
情况2:球无标号,盒有标号,允许空盒.
插板法,答案为(n+m−1n)\binom{n+m-1}{n}(nn+m−1).
情况3:球无标号,盒无标号,不允许空盒.
设fi,jf_{i,j}fi,j表示iii个球放入jjj个盒子的方案数,分两种情况讨论:
1.每个盒子中放入一个球,方案数为fi−j,jf_{i-j,j}fi−j,j.
2.将一个球放入一个盒子,方案数为fi−1,j−1f_{i-1,j-1}fi−1,j−1.
综合起来就是:
fi,j=fi−j,j+fi−1,j−1
f_{i,j}=f_{i-j,j}+f_{i-1,j-1}
fi,j=fi−j,j+fi−1,j−1
情况4:球无标号,盒无标号,允许空盒.
与情况3类似的有:
fi,j=fi−j,j+fi,j−1
f_{i,j}=f_{i-j,j}+f_{i,j-1}
fi,j=fi−j,j+fi,j−1
情况5:球有标号,盒有标号,允许空盒.
每个球可以放入有mmm种选择,答案为mnm^{n}mn.
情况6:球有标号,盒无标号,不允许空盒.
答案为第二类stirling数,即S2(n,m)S_2(n,m)S2(n,m).
情况7:球有标号,盒无标号,允许空盒.
对第二类stirling数求和,即:
∑i=0mS2(n,i)
\sum_{i=0}^{m}S_2(n,i)
i=0∑mS2(n,i)
情况8:球有标号,盒有标号,不允许空盒.
一个办法是对第二类stirling数乘上mmm的全排列,即m!S2(n,m)m!S_2(n,m)m!S2(n,m).
另一种办法是利用二项式反演,设fif_ifi表示nnn个有标号的球在不允许空盒的情况下放入iii个有标号的盒子的方案数,那么有:
mn=∑i=0m(mi)fi⇔fm=∑i=0m(−1)m−i(mi)in
m^{n}=\sum_{i=0}^{m}\binom{m}{i}f_i\Leftrightarrow f_m=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^{n}
mn=i=0∑m(im)fi⇔fm=i=0∑m(−1)m−i(im)in
三.第二类stirling数的通项公式.
将fi=i!S2(n,i)f_i=i!S_2(n,i)fi=i!S2(n,i)代入第二个式子中我们可以得到:
m!S2(n,m)=∑i=0m(−1)m−i(mi)inS2(n,m)=∑i=0m(−1)ii!(m−i)n(m−i)!
m!S_2(n,m)=\sum_{i=0}^{m}(-1)^{m-i}\binom{m}{i}i^{n}\\
S_2(n,m)=\sum_{i=0}^{m}\frac{(-1)^{i}}{i!}\frac{(m-i)^{n}}{(m-i)!}
m!S2(n,m)=i=0∑m(−1)m−i(im)inS2(n,m)=i=0∑mi!(−1)i(m−i)!(m−i)n
这是第二类stirling数通项公式.
容易看出,第二类stirling数的通项公式是一个卷积形式,利用NTT,我们可以在O(m(logn+logm))O(m(\log n+\log m))O(m(logn+logm))的时间复杂度内求出一行第二类stirling数.
四.自然数幂和与第二类stirling数.
将fi=i!S2(n,i)f_i=i!S_2(n,i)fi=i!S2(n,i)代入第一个式子中我们可以得到:
mn=∑i=0m(mi)i!S2(n,i)=∑i=0nS2(n,i)mi‾
m^{n}=\sum_{i=0}^{m}\binom{m}{i}i!S_2(n,i)=\sum_{i=0}^{n}S_2(n,i)m^{\underline{i}}\\
mn=i=0∑m(im)i!S2(n,i)=i=0∑nS2(n,i)mi
将这个结论带入自然数幂和:
∑i=1nik=∑i=1n∑j=0i(ij)j!S2(k,j)=∑i=0ni!S2(k,i)∑j=in(ji)=∑i=0ni!S2(k,i)(n+1i+1)=∑i=0ni!(n+1)i+1‾(i+1)!S2(k,i)=∑i=0n(n+1)i+1‾i+1S2(k,i)=∑i=0k(n+1)i+1‾i+1S2(k,i)
\sum_{i=1}^{n}i^{k}\\
=\sum_{i=1}^{n}\sum_{j=0}^{i}\binom{i}{j}j!S_2(k,j)\\
=\sum_{i=0}^{n}i!S_2(k,i)\sum_{j=i}^{n}\binom{j}{i}\\
=\sum_{i=0}^{n}i!S_2(k,i)\binom{n+1}{i+1}\\
=\sum_{i=0}^{n}i!\frac{(n+1)^{\underline{i+1}}}{(i+1)!}S_2(k,i)\\
=\sum_{i=0}^{n}\frac{(n+1)^{\underline{i+1}}}{i+1}S_2(k,i)\\
=\sum_{i=0}^{k}\frac{(n+1)^{\underline{i+1}}}{i+1}S_2(k,i)
i=1∑nik=i=1∑nj=0∑i(ji)j!S2(k,j)=i=0∑ni!S2(k,i)j=i∑n(ij)=i=0∑ni!S2(k,i)(i+1n+1)=i=0∑ni!(i+1)!(n+1)i+1S2(k,i)=i=0∑ni+1(n+1)i+1S2(k,i)=i=0∑ki+1(n+1)i+1S2(k,i)
这样就能做到O(klogk)O(k\log k)O(klogk)处理自然数幂和了.
五.Bell数.
对第二类stirling数有了更加深入的探讨后,我们再引入它的一行和Bell数.
Bell数:Bell数BnB_nBn定义为:
Bn=∑i=0nS2(n,i)
B_n=\sum_{i=0}^{n}S_2(n,i)
Bn=i=0∑nS2(n,i)
其组合意义为将nnn个有标号的球划分为若干个无标号的集合的方案数.
我们已经可以做到O(nlogn)O(n\log n)O(nlogn)求出单个Bell数,但是这个做法用到了常数大且较为难写的NTT,并不优秀.
来试着将其写成更好计算的形式:
Bn=∑i=0nS2(n,i)=∑i=0n∑j=0i(−1)jj!(i−j)n(i−j)!=∑i=0n(−1)ii!∑j=in(j−i)n(j−i)!=∑i=0n(−1)ii!∑j=0n−ijnj!
B_n=\sum_{i=0}^{n}S_2(n,i)\\
=\sum_{i=0}^{n}\sum_{j=0}^{i}\frac{(-1)^{j}}{j!}\frac{(i-j)^{n}}{(i-j)!}\\
=\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\sum_{j=i}^{n}\frac{(j-i)^{n}}{(j-i)!}\\
=\sum_{i=0}^{n}\frac{(-1)^{i}}{i!}\sum_{j=0}^{n-i}\frac{j^{n}}{j!}
Bn=i=0∑nS2(n,i)=i=0∑nj=0∑ij!(−1)j(i−j)!(i−j)n=i=0∑ni!(−1)ij=i∑n(j−i)!(j−i)n=i=0∑ni!(−1)ij=0∑n−ij!jn
现在只需要对jnj!\frac{j^{n}}{j!}j!jn这个式子求前缀和,就可以直接做到O(nlogn)O(n\log n)O(nlogn)求解单个Bell数了.
六.Bell数的生成函数.
这个方法可以做到O(nlogn)O(n\log n)O(nlogn)求解所有i∈[1,n]i\in [1,n]i∈[1,n]的Bell数BiB_iBi.
首先根据Bell数的组合意义,我们枚举最后一个数所在的集合大小,可以得到如下递推式:
Bn+1=∑i=0n(ni)Bn−i
B_{n+1}=\sum_{i=0}^{n}\binom{n}{i}B_{n-i}
Bn+1=i=0∑n(in)Bn−i
设BnB_nBn的指数型生成函数为B(x)B(x)B(x),根据上式容易得到:
B′(x)=B(x)exB′(x)B(x)=ex∫B′(x)B(x)dx=ex−1lnB(x)=ex−1B(x)=eex−1
B'(x)=B(x)e^{x}\\
\frac{B'(x)}{B(x)}=e^{x}\\
\int \frac{B'(x)}{B(x)}\mathrm{d}x=e^{x}-1\\
\ln B(x)=e^{x}-1\\
B(x)=e^{e^{x}-1}
B′(x)=B(x)exB(x)B′(x)=ex∫B(x)B′(x)dx=ex−1lnB(x)=ex−1B(x)=eex−1
利用多项式exp\expexp即可做到O(nlogn)O(n\log n)O(nlogn)求解.
七.两类stirling数与三种幂.
首先,我们可以尝试得到上升幂和下降幂之间的关系:
xn‾=∏i=0n−1(x−i)=(−1)n∏i=0n−1(−x+i)=(−1)n(−x)n‾xn‾=∏i=0n−1(x+i)=(−1)n∏i=0n−1(−x−i)=(−1)n(−x)n‾
x^{\underline{n}}=\prod_{i=0}^{n-1}(x-i)=(-1)^{n}\prod_{i=0}^{n-1}(-x+i)=(-1)^{n}(-x)^{\overline{n}}\\
x^{\overline{n}}=\prod_{i=0}^{n-1}(x+i)=(-1)^{n}\prod_{i=0}^{n-1}(-x-i)=(-1)^{n}(-x)^{\underline{n}}
xn=i=0∏n−1(x−i)=(−1)ni=0∏n−1(−x+i)=(−1)n(−x)nxn=i=0∏n−1(x+i)=(−1)ni=0∏n−1(−x−i)=(−1)n(−x)n
然后,我们在上面已经得到了幂和下降幂之间的关系:
xn=∑i=0nS2(n,i)xi‾
x^{n}=\sum_{i=0}^{n}S_2(n,i)x^{\underline{i}}
xn=i=0∑nS2(n,i)xi
将xxx换成−x-x−x,我们可以得到幂和上升幂之间的关系:
(−x)n=∑i=0nS2(n,i)(−x)i‾(−x)n=∑i=0n(−1)iS2(n,i)xi‾xn=∑i=0n(−1)n−iS2(n,i)xi‾
(-x)^{n}=\sum_{i=0}^{n}S_2(n,i)(-x)^{\underline{i}}\\
(-x)^{n}=\sum_{i=0}^{n}(-1)^{i}S_2(n,i)x^{\overline{i}}\\
x^{n}=\sum_{i=0}^{n}(-1)^{n-i}S_2(n,i)x^{\overline{i}}
(−x)n=i=0∑nS2(n,i)(−x)i(−x)n=i=0∑n(−1)iS2(n,i)xixn=i=0∑n(−1)n−iS2(n,i)xi
我们发现只有第二类stirling数为系数的关系式,于是猜想一个第一类stirling数为系数的关系式:
xn‾=∑i=0nS1(n,i)xi
x^{\overline{n}}=\sum_{i=0}^{n}S_1(n,i)x^{i}
xn=i=0∑nS1(n,i)xi
归纳证明后发现它是对的,于是再次将xxx换−x-x−x可以得到:
xn‾=∑i=0n(−1)n−iS1(n,i)xi
x^{\underline{n}}=\sum_{i=0}^{n}(-1)^{n-i}S_1(n,i)x^{i}
xn=i=0∑n(−1)n−iS1(n,i)xi
于是我们得到了在幂和上升幂、下降幂之间转化的公式.
八.stirling反演.
我们将下降幂与幂的关系式代入幂与下降幂的关系式可以得到:
xn=∑i=0nS2(n,i)xi‾=∑i=0nS2(n,i)∑j=0i(−1)i−jS1(i,j)xj=∑i=0n∑j=0i(−1)i−jS2(n,i)S1(i,j)xj=∑i=0n∑j=in(−1)j−iS2(n,j)S1(j,i)xi
x^{n}=\sum_{i=0}^{n}S_2(n,i)x^{\underline{i}}\\
=\sum_{i=0}^{n}S_2(n,i)\sum_{j=0}^{i}(-1)^{i-j}S_1(i,j)x^{j}\\
=\sum_{i=0}^{n}\sum_{j=0}^{i}(-1)^{i-j}S_2(n,i)S_1(i,j)x^{j}\\
=\sum_{i=0}^{n}\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)x^{i}
xn=i=0∑nS2(n,i)xi=i=0∑nS2(n,i)j=0∑i(−1)i−jS1(i,j)xj=i=0∑nj=0∑i(−1)i−jS2(n,i)S1(i,j)xj=i=0∑nj=i∑n(−1)j−iS2(n,j)S1(j,i)xi
取出其中第iii项:
[n=i]xi=∑j=in(−1)j−iS2(n,j)S1(j,i)xi
[n=i]x^{i}=\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)x^{i}
[n=i]xi=j=i∑n(−1)j−iS2(n,j)S1(j,i)xi
同时除以xix^{i}xi得到反转公式:
[n=i]=∑j=in(−1)j−iS2(n,j)S1(j,i)
[n=i]=\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)
[n=i]=j=i∑n(−1)j−iS2(n,j)S1(j,i)
于是我们猜想stirling反演:
fn=∑i=0nS2(n,i)gi⇔gn=∑i=0n(−1)n−iS1(n,i)fi
f_n=\sum_{i=0}^{n}S_2(n,i)g_i\Leftrightarrow g_n=\sum_{i=0}^{n}(-1)^{n-i}S_1(n,i)f_i\\
fn=i=0∑nS2(n,i)gi⇔gn=i=0∑n(−1)n−iS1(n,i)fi
代入验证:
fn=∑i=0nS2(n,i)gi=∑i=0nS2(n,i)∑j=0i(−1)i−jS1(i,j)fj=∑i=0n∑j=0i(−1)i−jS2(n,i)S1(i,j)fj=∑i=0n∑j=in(−1)j−iS2(n,j)S1(j,i)fj=∑i=0n[n=i]fi=fn
f_n=\sum_{i=0}^{n}S_2(n,i)g_i\\
=\sum_{i=0}^{n}S_2(n,i)\sum_{j=0}^{i}(-1)^{i-j}S_1(i,j)f_j\\
=\sum_{i=0}^{n}\sum_{j=0}^{i}(-1)^{i-j}S_2(n,i)S_1(i,j)f_j\\
=\sum_{i=0}^{n}\sum_{j=i}^{n}(-1)^{j-i}S_2(n,j)S_1(j,i)f_j\\
=\sum_{i=0}^{n}[n=i]f_i\\
=f_n
fn=i=0∑nS2(n,i)gi=i=0∑nS2(n,i)j=0∑i(−1)i−jS1(i,j)fj=i=0∑nj=0∑i(−1)i−jS2(n,i)S1(i,j)fj=i=0∑nj=i∑n(−1)j−iS2(n,j)S1(j,i)fj=i=0∑n[n=i]fi=fn
同理我们可以得到另一个反转公式和stirling反演:
∑j=in(−1)j−iS1(n,j)S2(j,i)=[n=i]fn=∑i=0nS1(n,i)gi⇔gn=∑i=0n(−1)n−iS2(n,i)fi
\sum_{j=i}^{n}(-1)^{j-i}S_1(n,j)S_2(j,i)=[n=i]\\
f_n=\sum_{i=0}^{n}S_1(n,i)g_i\Leftrightarrow g_n=\sum_{i=0}^{n}(-1)^{n-i}S_2(n,i)f_i
j=i∑n(−1)j−iS1(n,j)S2(j,i)=[n=i]fn=i=0∑nS1(n,i)gi⇔gn=i=0∑n(−1)n−iS2(n,i)fi
本文深入探讨了两类Stirling数的定义与递推公式,详细解析了球与盒子问题的八种计数情况,介绍了第二类Stirling数的通项公式及其与自然数幂和的关系,讲解了Bell数的概念及其生成函数,揭示了Stirling数与幂、上升幂、下降幂之间的转换公式,最后阐述了Stirling反演原理。
2402

被折叠的 条评论
为什么被折叠?



