斯特林数相关

联合省选的D1T2放出了一道裸的斯特林数,幸亏之前推过第二类斯特林数求自然数幂和,所以很幸运地切了。
这次比赛之后dyp和gmh77疯狂学斯特林数,从此免疫。
惊得我也系统地学一下斯特林数做做样子。


概念

第一类斯特林数:记为\(s(m,n)\)(也可以用中括号表示),组合意义为\(m\)个数形成\(n\)个圆排列的方案数。
有个比较系统的定义:\(s(m,n)=[x^n]\prod_{i=0}^{m-1}(x+i)\)
性质:
\(s(m,n)=(m-1)*s(m-1,n)+s(m-1,n-1)\)
组合意义可证。
\(\sum_{k=0}^ns(n,k)=n!\)
每一种排列,对应着一种轮换。意思记排列为\(p\)\(i\)\(p_i\)连边,这样就会形成若干个环。

第二类斯特林数:记为\(S(m,n)\)(也可以用大括号表示),组合意义为\(m\)个数形成\(n\)个集合的方案数。
性质:
\(S(m,n)=n*S(m-1,n)+S(m-1,n-1)\)
组合意义可证。
\(S(m,n)=\frac{1}{n!}\sum_{k=0}^{n}(-1)^kC(n,k)(n-k)^m\)
容斥得到。
\(\sum_{k=0}^nS(n,k)=B_n\)
\(B\)表示贝尔数。

有符号斯特林数:顾名思义就是有符号的斯特林数。
\(s_s(m,n)=-(m-1)*s_s(m-1,n)+s_s(m-1,n-1)\)
\(S_s(m,n)=-n*S_s(m-1,n)+S_s(m-1,n-1)\)

下标\(s\)意思为“signed”

打个表出来可以发现
\(s_s(m,n)=(-1)^{m-n}s(m,n)\)
\(S_s(m,n)=(-1)^{m-n}S(m,n)\)


性质

\(s(m,n)\geq S(m,n)\)
排列数大于等于集合数。

普通幂、上升幂、下降幂相关:(这个在推式子的时候经常能够用到!)
\(x^n=\sum_{k=0}^nS(n,k)x^{\underline k}\)
\(x^n=\sum_{k=0}^nS(n,k)(-1)^{n-k}x^{\overline k}=\sum_{k=0}^nS_s(n,k)x^{\overline k}\)
\(x^{\overline n}=\sum_{k=0}^ns(n,k)x^k\)
\(x^{\underline n}=\sum_{k=0}^ns(n,k)(-1)^{n-k}x^k=\sum_{k=0}^ns_s(n,k)x^k\)
具体证明嘛,各种归纳,各种组合意义。


快速求斯特林数

第一类斯特林数:
把定义式搬下来:\(s(m,n)=[x^n]\prod_{i=0}^{m-1}(x+i)\)
\(s_m(x)=\prod_{i=0}^{m-1}(x+i)\)
考虑倍增求这个东西。从\(s_m(x)\)推到\(s_{2m}(x)\)时:
\(s_{2m}(x)=s_{m}(x)s_m(x+m)\)
快速求出\(s_m(x+m)\)。设\(s_m(x)=\sum_{i=0}^ms_{m,i}x^i\)。之前已经求出\(s_{m,i}\)
\(s_m(x+m)=\sum_{i=0}^ms_{m,i}(x+m)^i\)
二项式展开一下,推一波式子,就可以发现一个卷积。
于是计算\(s_m(x+m)\)的时间复杂度是\(O(m\lg m)\)的。
由于\(m\)是两倍两倍地扩大,所以总的时间复杂度也是\(O(m \lg m)\)

第二类斯特林数:
把上面那个普通幂转下降幂的式子搬下来,简单反演一下,得到:
\(n!S(m,n)=\sum_{k=0}^{n}(-1)^kC(n,k)(n-k)^m\)
把后面的那个组合数拆开,可以发现这是个很明显的卷积形式。
时间复杂度\(O(n \lg n)\)


斯特林反演

\(f(n)=\sum_{k=0}^n S(n,k)g(k) \Longleftrightarrow g(n)=\sum_{k=0}^n(-1)^{n-k}s(n,k)f(k)\)
有个叫反转公式的东西:
\(\sum_ks(n,k)S(k,m)(-1)^{n-k}=[m=n]\)
\(\sum_kS(n,k)s(k,m)(-1)^{n-k}=[m=n]\)
关于这个怎么证明……最严谨的方法应该是归纳。

写公式太麻烦,直接口胡一下证明的思路(挺好推的)。
比如上面这条式子:\(\sum_ks(n,k)S(k,m)(-1)^{n-k}=[m=n]\)
先将\(s(n,k)\)用递推式拆开,展开一下。
再将\(S(k,m)\)用递推式拆开,展开一下。
照着这么做就可以很自然地归纳证明出来了。
另一条式子也可以类似地推出来。
看了一些博客,有些博客里面写了一种不是很严谨的证明方法:
具体就是取一个普通幂\(n^m\),将它先用第二类斯特林数表示成下降幂多项式,然后将这个下降幂用第一类斯特林数表示成普通幂。
推推式子就会得到这样:\(n^m=\sum_{j=0}^mn^j\sum_{k=j}^mS(m,k)s(k,j)(-1)^{j-k}\)
然后谁告诉我,这怎么就能直接得到\(\sum_{k=j}^mS(m,k)s(k,j)(-1)^{j-k}=[j=m]\)了???
这种方法只能解释假设反转公式成立,这个东西也成立;但不能反过来推啊……

如果设矩阵\(F_{i,j}=S(i,j)\)\(G_{i,j}=(-1)^{i-j}s(i,j)\)
(或者\(F_{i,j}=s(i,j)\)\(G_{i,j}=(-1)^{i-j}S(i,j)\)
不难发现\(F*G=E\),即\(F\)\(G\)互逆。

拉赫数(第三类斯特林数?)

似乎只有维基上略有提及,所以不够详细请见谅。
有错误请指出。

无符号拉赫数:
上升幂和下降幂定义:
\(x^{\overline n}=\sum_{k=0}^nL(n,k)x^{\underline n}\)
\(x^{\underline n}=\sum_{k=0}^{n}(-1)^{n-k}L(n,k)x^{\overline n}\)
递推式定义:\(L(m,n)=L(m-1,n-1)+(n-1+m)L(m,n-1)\)
矩阵乘法定义:\(L(m,n)=\sum_k s(m,k)S(k,n)\)

有符号拉赫数:
上升幂和下降幂定义:
\(x^{\overline n}=(-1)^n\sum_{k=0}^nL_s(n,k)x^{\underline n}\)
\(x^{\underline n}=(-1)^k\sum_{k=0}^{n}L_s(n,k)x^{\overline n}\)
\(L_s(m,n)=(-1)^mL(m,n)\)

性质:
\(L(m,n)=C(m-1,n-1)\frac{m!}{n!}\)
归纳可证:
\(\sum_kL_s(m,k)L_s(k,n)=\sum_k(-1)^{m-k}L(m,k)L(k,n)=[m=n]\)
\(L(n,k)=n![x^n]\frac{1}{k!}(\frac{x}{1-x})^k\)


参考资料

https://www.cnblogs.com/Wuweizheng/p/8638858.html
https://www.cnblogs.com/hchhch233/p/10016543.html
https://www.cnblogs.com/owenyu/p/6724661.html
https://www.cnblogs.com/gzy-cjoier/p/8426987.html
百度百科
维基百科

posted @ 2020-06-29 22:33  jz_597  阅读(427)  评论(5编辑  收藏  举报