欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

从零开始的斯特林数问题

程序员文章站 2022-03-04 08:29:14
全力施工中。 update:基础部分已完成,缺少例题。 第一类斯特林数 定义 轮换斯特林数$s(n,m)=\begin{bmatrix}n\\m\end{bmatrix}$表示将n个元素分成为m个环的方案数。 递推式 $s(n,m)=s(n 1,m 1)+(n 1)s(n 1,m)$,边界$s(0, ......

全力施工中。

update:基础部分已完成,缺少例题。

第一类斯特林数

定义

轮换斯特林数\(s(n,m)=\begin{bmatrix}n\\m\end{bmatrix}\)表示将n个元素分成为m个环的方案数。

递推式 \(s(n,m)=s(n-1,m-1)+(n-1)s(n-1,m)\),边界\(s(0,0)=1\)

性质

\[ \begin{aligned} &\sum_{i=0}^ns(n,i)=n!\\ &\sum_{i=0}^ns(n,i)(-1)^i=0(n\ge2)\\ &\sum_{i=0}^ns(n,i)x^i=x^{\overline{n}}\\ &\sum_{i=0}^ns(n,i)(-1)^{n-i}x^i=x^{\underline{n}} \end{aligned} \]

证明自行操作。

母函数

设它的母函数为\(g_n(x)\),易知
\[ g_n(x)=x^\overline{n}=\prod_{i=0}^{n-1}(x+i)\\ g_{2n}(x)=\prod_{i=0}^{n-1}(x+i)\prod_{i=0}^{n-1}(n+x+i)=g_n(x)g_n(x+n)\\ g_{2n}(x+1)=\prod_{i=0}^{n-1}(x+i)\prod_{i=0}^{n-1}(n+x+i)=(x+n-1)g_n(x)g_n(x+n)\\ \]
其中
\[ \begin{aligned} g_n(x+n)&=\sum_{i=0}^n s(n,i)(x+n)^i\\ &=\sum_{i=0}^ns(n,i)\sum_{j=0}^ic(i,j)n^{i-j}x^j\\ &=\sum_{i=0}^ns(n,i)\sum_{j=0}^n\frac{i!}{j!\times (i-j)!}n^{i-j}x^j\\ &=\sum_{j=0}^n\frac{x^j}{j!}\sum_{i=0}^ns(n,i)\times i!\times\frac{n^{i-j}}{(i-j)!} \end{aligned} \]
于是快速地从\(g_n(x)\)得到\(g_n(x+n)\)。(参考附录)

因此采取分治策略计算\(g_n(x)\),复杂度与多项式求逆相近,为\(o(n\log n)\)

第二类斯特林数

定义

子集斯特林数\(s(n,m)=\begin{bmatrix}n\\m\end{bmatrix}\)表示将n个元素分成m个组的方案数。

递推式 \(s(n,m)=s(n-1,m-1)+ms(n-1,m)\),边界\(s(0,0)=1\)

性质

\[ \begin{aligned} &\sum_{i=0}^ms(n,i)\times i!\times c(m,i)=m^n\\ &s(n,m)=\frac{1}{m!}\sum_{i=0}^m(-1)^ic(m,i)(m-i)^n\\ &\sum_{i=0}^ni^m=\sum_{i=0}^m\frac{(n+1)^{\underline{i+1}}s(m,i)}{i+1} \end{aligned} \]

前两点自行脑补,下面用前两点推导第三点
\[ \sum_{i=0}^ni^m =\sum_{i=0}^n\sum_{j=0}^is(m,j)\times j!\times c(i,j) =\sum_{i=0}^n\sum_{j=0}^ms(m,j)\times j!\times c(i,j)\\ =\sum_{j=0}^ms(m,j)\times j!\sum_{i=0}^nc(i,j) =\sum_{j=0}^ms(m,j)\times j!\times c(n+1,j+1)\\ =\sum_{j=0}^m\frac{s(m,j)\times j!\times (n+1)!}{(j+1)!\times (n-j)!} =\sum_{i=0}^m\frac{(n+1)^{\underline{i+1}}s(m,i)}{i+1} \]

母函数

设它的母函数为\(g_n(x)\),易知
\[ \begin{aligned} g_n(x)&=\sum_i s(n,i)x^i\\ &=\sum_i\frac{1}{i!}\sum_{j=0}^i(-1)^jc(i,j)(i-j)^nx^i\\ &=\sum_i\sum_j\frac{(-1)^j(i-j)^n}{j!(i-j)!}x^i\\ &=(\sum_{i=0}\frac{(-1)^i}{i!}x^i)(\sum_{i=0}\frac{i^n}{i!}x^i) \end{aligned} \]
就很好做了似乎。

斯特林反演

定义

\[ f(n)=\sum_{i=0}^n s(n,i)g(i) \leftrightarrow g(n)=\sum_{i=0}^n(-1)^{n-i}s(n,i)f(i) \]

推导

结合幂、阶乘幂的变换
\[ \begin{aligned} m^\underline n &=\sum_{i=0}^ns(n,i)(-1)^{n-i}m^i\\ &=\sum_{i=0}^ns(n,i)(-1)^{n-i}\sum_{j=0}^m s(i,j)\times j!\times c(m,j)\\ &=\sum_{i=0}^ns(n,i)(-1)^{n-i}\sum_{j=0}^m s(i,j)\times m^\underline j\\ &=\sum_{i=0}^ns(n,i)(-1)^{n-i}\sum_{j=0}^n s(i,j)\times m^\underline j\\ &=\sum_{j=0}^nm^\underline j\sum_{i=0}^n(-1)^{n-i}s(n,i)s(i,j)\\ \end{aligned} \]
可知等式

\[ \sum_{i=m}^n(-1)^{n-i}s(n,i)s(i,m)=\sum_{i=0}^n(-1)^{n-i}s(n,i)s(i,m)=[n=m] \]

类似地也能得等式
\[ \sum_{i=m}^n(-1)^{n-i}s(n,i)s(i,m)=\sum_{i=0}^n(-1)^{n-i}s(n,i)s(i,m)=[n=m] \]
于是先证从左到右
\[ \begin{aligned} g(n)&=\sum_{i=0}^n(-1)^{n-i}s(n,i)\sum_{j=0}^i s(i,j)g(j)\\ &=\sum_{i=0}^n(-1)^{n-i}s(n,i)\sum_{j=0}^n s(i,j)g(j)\\ &=\sum_{j=0}^n g(j)\sum_{i=0}^n(-1)^{n-i}s(n,i)s(i,j)\\ &=g(n) \end{aligned} \]
类似地也能证明从右到左。

附录

上升阶乘幂\(x^{\overline{n}}=\frac{(x+n-1)!}{(x-1)!}\),下降阶乘幂\(x^{\underline{x}}=\frac{x!}{(x-n)!}\),两者的关系是\(x^{\overline{n}}=(-1)^nx^{\underline{n}}\)\(x^{\underline{n}}=(-1)^nx^{\overline{n}}\)

递推式的参考

母函数的参考

一类卷积的处理

问题:已知\(a(x)=\sum_{i=0}^n a_ix^i\), \(b(x)=\sum_{i=0}^n b_ix^i\),求解\(c(x)=\sum_{i=0}^nx^i(\sum_{j=i}^na_jb_{j-i})\)

做法:设对于\(p(x)=\sum_{i=0}^np_ix^i\)\(p_r(x)=\sum_{i=0}^np_{n-i}x^i\),则
\[ \begin{aligned} c_r(x)&=\sum_{i=0}^nx^i(\sum_{j=n-i}^na_jb_{j-(n-i)})\\ &=\sum_{i=0}^nx^i(\sum_{j=0}^ia_{j+(n-i)}b_j)\\ &=\sum_{i=0}^nx^i(\sum_{j=0}^ia(x)_{j+(n-i)}b(x)_j)\\ &=\sum_{i=0}^nx^i(\sum_{j=0}^ia_r(x)_{i-j}b(x)_j)\\ &=a_r(x)b(x) \end{aligned} \]

习题

[cf960g] bandit blues - 求第一类斯特林数