原文链接:https://www.cnblogs.com/ww3113306/p/10413829.html
斯特林数
- 斯特林数的内容主要参考自zzd大佬的博客
- 在此基础上加上了一些自己的理解和补充内容。
- 还没写完
第一类斯特林数
定义
\(S_1(n, m)\)表示\(n\)个点,组成\(m\)个圆排列的方案数,记做\(\begin{bmatrix}n\\m\end{bmatrix}\),递推公式为:
\[\begin{bmatrix}n\\k\end{bmatrix} = (n - 1)\begin{bmatrix}n - 1\\k\end{bmatrix} + \begin{bmatrix}n - 1\\k - 1\end{bmatrix}
\]
理解:单独考虑新加入的第\(n\)个点。
- 第\(n\)个点可以独立构成一个新的圆,因此只需要再加上前\(n - 1\)个点构成\(k - 1\)个圆的方案数\(\begin{bmatrix}n - 1\\k - 1\end{bmatrix}\).
- 第\(n\)个点可以插入原来有的任意一个圆中(不单独成圆)的任意一个点的左边,故有\((n - 1)\begin{bmatrix}n - 1\\k\end{bmatrix}\)种方案
与阶乘的关系
\[n! = \sum_{i = 0}^{n}\begin{bmatrix}n\\i\end{bmatrix}
\]
证明:考虑其组合意义,一个排列对应一个置换,而一个置换会把\(n\)元素分成若干个置换环,其中每一种方案都对应一个置换。而我们把\(n\)个点分成若干个圆排列,就等价于把\(n\)个元素分成若干个置换环,因此我们枚举了把\(n\)个点分成若干个圆排列的方案数,就相当于枚举了置换的方案数。因此上式成立。
与上升/下降次幂的关系
下降次幂
\[x^{\underline{n}} = \sum_{i = 0}^n \begin{bmatrix}n\\i\end{bmatrix}(-1)^{n - i}x^i
\]
(注意这个地方枚举从0开始和从1开始是等价的,因为\(\begin{bmatrix}n\\0\end{bmatrix} = 0\))
可以用数学归纳法证明:
\[x^{\underline{n + 1}} = (x - n)x^{\underline{n}}
\]
\[= x \cdot x^{\underline{n}} - nx^{\underline{n}}
\]
\[= \left( \sum_{i = 0}^{n} \begin{bmatrix}n\\i \end{bmatrix}(-1)^{n - i}x^{i + 1}\right ) - \left(n\sum_{i = 0}^{n} \begin{bmatrix}n\\i\end{bmatrix} (-1)^{n - i}x^i\right)
\]
\[= \left(\sum_{i = 1}^{n + 1}\begin{bmatrix}n\\i - 1 \end{bmatrix}(-1)^{n - i + 1}x^i\right) - \left(n\sum_{i = 1}^{n + 1}\begin{bmatrix}n\\i\end{bmatrix}(-1)^{n - i}x^i\right)
\]
\[= \sum_{i = 1}^{n + 1}\left(\begin{bmatrix}n\\i - 1 \end{bmatrix} + n \begin{bmatrix}n\\i\end{bmatrix}\right)(-1)^{n - i + 1}x^i
\]
\[= \sum_{i = 1}^{n + 1}\begin{bmatrix}n + 1\\i\end{bmatrix}(-1)^{n + 1 - i}x^i
\]
####**上升次幂**
$$x^{\overline{n}} = \sum_{i = 0}^{n}\begin{bmatrix}n\\k\end{bmatrix}x^{k}$$
相当于把下降次幂的式子中的-1给去掉了。
##第一类斯特林数求法(分治FFT,倍增FFT)
最简单的当然就是直接根据递推式来求啦,但是有时候这样的复杂度不够优秀,因此我们需要一点更加优秀的求解方法。
根据第一类斯特林数和上升次幂/下降次幂的关系,我们可以知道将特定的一些下降/上升次幂展开后系数的第\(k\)次项的绝对值就是要求的斯特林数的第\(k\)项。
而上升/下降次幂可以看做一些多项式相乘(本身展开后就是多项式,而不同的上升/下降次幂可以通过合并不同的上升/下降次幂得到)
分治FFT
不会证,貌似要用生成函数?
直接背下来吧,挺好背的。
\[\prod_{i = 0}^{n - 1}(x + i)
\]
乘出来的多项式的第\(k\)项就是\(\begin{bmatrix}n\\k\end{bmatrix}\)
倍增FFT
因此我们考虑利用这2个式子来求斯特林数。
为了方便,我们选择利用上升幂的式子:
设
\[f(x) = x^{\overline{n}} = \sum_{i = 0}^n \begin{bmatrix} n\\i\end{bmatrix}x^i
\]
\[\ g(x) = (x + n)^{\overline{n}} = \sum_{i = 0}^{n} \begin{bmatrix}n\\i\end{bmatrix}(x + n)^i
\]
那么我们有:
\[f(x)g(x) = (x + n)^{\overline{2n}} = \sum_{i = 0}^{2n} \begin{bmatrix}2n\\i\end{bmatrix}(x + n)^i
\]
显然可以直接上分治FFT。
但其实我们还有更加优秀的做法。
考虑在分治FFT的基础上进行优化。
思考一下为什么分治FFT是\(nlog^2n\)的?
首先每一层的复杂度要计算\(n\)个点,一共有\(logn\)层,一共计算\(nlogn\)个元素,每个元素的复杂度是\(logn\)的,所以总复杂度\(nlog^2n\)。
\(logn\)层这个肯定没法优化,我们考虑优化每一层需要求解的点数.
如果我们可以用同一层的前半部分快速求出后半部分,那么我们每次就只需要递归前半部分,那么我们就不用在每一层都对当前层所有的元素的计算,而只需要对一小块计算。
因此我们考虑如何用前半部分快速计算后半部分。
(此处为了书写方便,用\(a_i\)代替\(\begin{bmatrix} n\\i\end{bmatrix}\))
\[g(x) = \sum_{i = 0}^na_i\sum_{j = 0}^i\binom{i}{j}n^{i - j}x^j
\]
换成枚举\(x^i\)
\[= \sum_{i = 0}^nx^i \left( \sum_{j = i}^n\binom{j}{i}n^{j - i}a_j \right)
\]
\[= \sum_{i = 0}^n \left( \sum_{j = i}^n\binom{j}{i}n^{j - i}a_j \right)x_i
\]
我们只需要求出括号内的数是多少即可。
\[\sum_{j = i}^n\binom{j}{i}n^{j - i}\ a_j
\]
现在我们有
\[F(j - i) = \binom{j}{i}n^{j - i}
\]
\[G(j) = a_j
\]
把\(F\)反转一下变成:
\[F(n - j + i + 1) = \binom{j}{i}n^{j - i}
\]
这样\(j + n - j + i + 1 = n + i + 1\),是一个定值。
虽然\(n + i + 1 > n\),但是因为数组中下标大于\(n\)的部分都是0,所以可以忽略。
因此我们所要求的系数就是:
\[\sum_{j = i}^n\binom{j}{i}n^{j - i}a_j = (F*G)(n + i + 1)
\]
因此我们做一遍FFT就可以得到\(g\)的系数了
那么这样计算的话,一共会计算多少元素呢?
\[n + \frac{n}{2} + \frac{n}{4} + ... + \frac{n}{n}
\]
是\(O(n)\)级别的!
因为对每个点进行计算的复杂度仍然是\(logn\)级别的,所以我们的总复杂度就可以做到\(nlogn\)。
更形象化的,这2个算法的区别可以这样描述:
考虑到后者其实是在用1个点,不断的乘2,最后得到整个序列。因此我们将它称之为倍增FFT。
第二类斯特林数
定义
\(S_2(n, m)\)表示\(n\)个元素分成\(m\)个集合的方案数,记做\(\left\{\begin{array}{c}n\\m\end{array}\right\}\)
递推式为:
\[\left\{\begin{array}{c}n\\m\end{array}\right\} = \left\{\begin{array}{c}n - 1\\m - 1\end{array}\right\} + m\left\{\begin{array}{c}n - 1\\m\end{array}\right\}
\]
理解:考虑第\(n\)个元素放在哪里,
- 第\(n\)个元素可以独立构成一个新集合,因此方案数为\(\left\{\begin{array}{c}n - 1\\m - 1\end{array}\right\}\).
- 第\(n\)个元素可以加入之前的任意一个集合中,因此方案数为\(\left\{ \begin{array}{c}n - 1 \\m\end{array} \right\}\)
重要式子
\[x^n = \sum_{k = 0}^n \left\{ \begin{array}{c} n \\ k \end{array} \right\} x^{\underline{k}}
\]
证明:还是用归纳法。。。
求解
一个式子:
\[m!\left\{ \begin{array}{c}n\\m\end{array}\right\} = \sum_{k = 0}^m \binom{m}{k}k^n(-1)^{m - k}
\]
证明:用递推式证明.
于是令
\[f(k) = \binom{m}{k}k^n, \quad g(m - k) = (-1)^{m - k}
\]
然后用FFT算算就好了。
广义斯特林数
\[\left\{ \begin{array}{c}n\\k\end{array}\right\} = \begin{bmatrix}-k\\-n\end{bmatrix}
\]
扩展/总结
来源1
基本式子
\[\begin{bmatrix}n\\k\end{bmatrix} = (n - 1)\begin{bmatrix}n - 1\\k\end{bmatrix} + \begin{bmatrix}n - 1\\k - 1\end{bmatrix}
\]
\[\left\{\begin{array}{c}n\\m\end{array}\right\} = \left\{\begin{array}{c}n - 1\\m - 1\end{array}\right\} + m\left\{\begin{array}{c}n - 1\\m\end{array}\right\}
\]
\[n! = \sum_{i = 0}^n \begin{bmatrix}n\\i\end{bmatrix}
\]
\[\left\{ \begin{array}{c}n\\k\end{array}\right\} = \begin{bmatrix}-k\\-n\end{bmatrix}
\]
特殊值
\[\left\{\begin{array}{c}n\\0\end{array}\right\} = \begin{bmatrix}n\\0\end{bmatrix} = [n == 0]
\]
\[\left\{\begin{array}{c}n\\1\end{array}\right\} = [n > 0]
\]
\[\begin{bmatrix}n\\1\end{bmatrix} = (n - 1)![n > 0]
\]
\[\left\{\begin{array}{c}n\\2\end{array}\right\} = (2^{n - 1} - 1)[n > 0]
\]
\[\begin{bmatrix}n\\2\end{bmatrix} = (n - 1)!\left(\sum_{i = 1}^{n - 1} \frac{1}{i}\right)[n > 0]
\]
\[\left\{\begin{array}{c}n\\n - 1\end{array}\right\} = \begin{bmatrix}n\\n - 1\end{bmatrix} = \binom{n}{2}
\]
\[\left\{\begin{array}{c}n\\n\end{array}\right\} = \begin{bmatrix}n\\n\end{bmatrix} = \binom{n}{n} = 1
\]
\[\left\{\begin{array}{c}n\\k\end{array}\right\} = \begin{bmatrix}n\\k\end{bmatrix} = \binom{n}{k} = 0, k > n
\]
各种幂相关
\[x^n = \sum_{k = 0}^n\left\{\begin{array}{c}n\\k\end{array}\right\}x^{\underline{k}} = \sum_{k = 1}^n\left\{\begin{array}{c}n\\k\end{array}\right\}(-1)^{n - k}x^{\overline{k}}
\]
\[x^{\underline{n}} = \sum_{k = 0}^{n}\begin{bmatrix}n\\k\end{bmatrix}(-1)^{n - k}x^k
\]
\[x^{\overline{n}} = \sum_{k = 0}^n\begin{bmatrix}n\\k\end{bmatrix}x^k
\]
反转公式
\[\sum_{k = 1}^n \begin{bmatrix}n\\k\end{bmatrix}\left\{\begin{array}{c}k\\m\end{array}\right\}(-1)^{n - k} = [n == m]
\]
\[\sum_{k = 1}^n\left\{\begin{array}{c}n\\k\end{array}\right\} \begin{bmatrix}k\\m\end{bmatrix}(-1)^{n - k} = [n == m]
\]
其他恒等式
\[\left\{\begin{array}{c}n + 1\\m + 1\end{array}\right\} = \sum_{k = 1}^n \binom{n}{k} \left\{\begin{array}{c}k\\m\end{array}\right\}
\]
\[\begin{bmatrix} n + 1\\ m + 1\end{bmatrix} = \sum_{k = 1}^n \begin{bmatrix}n\\k\end{bmatrix} \binom{k}{m}
\]
\[\left\{\begin{array}{c}n\\m\end{array}\right\} = \sum_{k = 1}^n\binom{n}{k}\left\{\begin{array}{c}k + 1\\m + 1\end{array}\right\}(-1)^{n - k}
\]
\[\begin{bmatrix}n\\m\end{bmatrix} = \sum_{k = 1}^n \begin{bmatrix}n + 1\\k + 1\end{bmatrix} \binom{k}{m}(-1)^{m - k}
\]
\[m!\left\{\begin{array}{c}n\\m\end{array}\right\} = \sum_{k = 1}^n\binom{m}{k}k^n(-1)^{m - k}
\]
\[\left\{\begin{array}{c}n + 1\\m + 1\end{array}\right\} = \sum_{k = 0}^n \left\{\begin{array}{c}k\\m\end{array}\right\}(m + 1)^{n - k}
\]
\[\begin{bmatrix}n + 1\\m + 1\end{bmatrix} = \sum_{k = 0}^n \begin{bmatrix}k\\m\end{bmatrix}n^{\underline{n - k}} = n!\sum_{k = 0}^n \frac{\begin{bmatrix}k\\m\end{bmatrix}}{k!}
\]
\[\left\{\begin{array}{c}m + n + 1\\m\end{array}\right\} = \sum_{k = 0}^mk\left\{\begin{array}{c}n + k\\k\end{array}\right\}
\]
\[\begin{bmatrix}m + n + 1\\m\end{bmatrix} = \sum_{k = 0}^m(n + k)\begin{bmatrix}n + k\\k\end{bmatrix}
\]
\[\binom{n}{m} = \sum_{k = 1}^n\left\{\begin{array}{c}n + 1\\k + 1\end{array}\right\} \begin{bmatrix}k\\m\end{bmatrix}(-1)^{m - k}
\]
\[n^{\underline{n - m}}[n \geq m] = \sum_{k = 1}^n \begin{bmatrix} n + 1\\k + 1\end{bmatrix}\left\{\begin{array}{c}k\\m\end{array}\right\}(-1)^{m - k}
\]
\[\left\{\begin{array}{c}n\\n - m\end{array}\right\} = \sum_{k = 1}^n \binom{m - n}{m + k} \binom{m + n}{n + k} \begin{bmatrix}m + k \\ k\end{bmatrix}
\]
\[\begin{bmatrix}n\\n - m\end{bmatrix} = \sum_{k = 1}^n \binom{m - n}{m + k} \binom{m + n}{n + k}\left\{\begin{array}{c}m + k\\k\end{array}\right\}
\]
\[\left\{\begin{array}{c}n\\l + m\end{array}\right\} \binom{l + m}{l} = \sum_{k = 1}^n\left\{\begin{array}{c}k\\l\end{array}\right\} \left\{\begin{array}{c}n - k\\m\end{array}\right\} \binom{n}{k}
\]
\[\begin{bmatrix}n \\ l + m\end{bmatrix} \binom{l + m}{l} = \sum_{k = 1}^n \begin{bmatrix}k\\l\end{bmatrix} \begin{bmatrix}n - k\\m\end{bmatrix}\binom{n}{k}
\]