自然数幂和

定义与约定

\[\Large S_k(n)=\sum_{i=0}^{n-1}i^k \]

注意是一直加到 \((n-1)^k\),不是 \(n^k\)

忽略了部分下取整符号。

扰动法

\[S_k(n)=\sum_{i=0}^{n-1}i^k \]

\[=\sum_{i=0}^{n-1}(i+1)^k - n^k \]

\[=\sum_{i=0}^{n-1} \sum_{d=0}^k{k \choose d}i^d - n^k \]

\[=\sum_{d=0}^k {k \choose d}\sum_{i=0}^{n-1}i^d - n^k \]

\[= \sum_{d=0}^k {k \choose d}S_d(n)-n^k \]

\[= S_k(n) + kS_{k-1}(n) - n^k + \sum_{d = 0}^{k-2}{k \choose d}S_d(n) \]

移项:

\[S_{k-1}(n)=1/k*(n^k-\sum_{d=0}^{k-2}{k \choose d}S_d(n)) \]

\[S_k(n)=\frac{n^{k+1}-\sum_{d=0}^{k-1}{k+1 \choose d}S_d(n)}{k+1} \]

复杂度:\(O(k^2)\)

优化:

\[S_k(n)=\frac{n^{k+1}}{k+1}-k!\sum_{d=0}^{k+1}\frac{S_d(n)}{d!}(k+1-d)! \]

分治FFT可以做到 \(O(klog^2k)\)

拉格朗日插值

根据常识,\(S_k(n)\) 是关于 \(n\)\(k+1\) 次多项式。于是可以用拉格朗日插值搞。

\[\large f(x)=\sum_{i=1}^{k+2} y_i\prod_{j \le k+2,j \not= i}\frac{x-x_i}{x_j-x_i} \]

发现后面那个的 \(x_i\) 是连续的,于是可以预处理前缀后缀积加速。复杂度:\(O(k)\)

伯努利数

考虑我们把这 \(k+1\) 次多项式精确地表示出来。这需要用伯努利数

\[\Large S_k(n)=\frac{1}{k+1} * \sum_{i = 0}^{k} {k+1 \choose i}B_in^{k-i+1} \]

直接预处理伯努利数后直接插值即可。

复杂度:\(O(k^2+qk)\)

优化:可以用多项式求逆预处理伯努利数,复杂度 \(O(klogk+qk)\)

第二类斯特林数

根据组合意义:

\[\Large n^m=\sum_{i} \begin{Bmatrix} m \\ i \end{Bmatrix} {n \choose i}i! \]

于是:

\[S_k(n)=\sum_{i=0}^{n-1}i^k \]

\[=\sum_{i=0}^{n-1}\sum_{j}\begin{Bmatrix} k \\ j \end{Bmatrix} {i \choose j}j!\]

\[=\sum_{j=0}^{k} \begin{Bmatrix} k \\ j \end{Bmatrix} j! \sum_{i=0}^{n-1}{i \choose j}\]

\[=\sum_{j=0}^k \begin{Bmatrix} k \\ j \end{Bmatrix}j! {n \choose j + 1} \]

然后就可以 \(O(k)\) 算了。

第一类斯特林数

众所周知,斯特林数擅长普通幂和上升幂/下降幂的转换,而上升幂/下降幂擅长处理类似“前缀和”的问题。所以我们可以尝试用斯特林数来解决自然数幂和问题。

根据组合意义:

\[\Large x^{\overline{n}}=\sum_{i=0}^n \begin{bmatrix} n\\ i \end{bmatrix} x^i \]

这个组合意义是:枚举每种将 \(n\) 分成若干种轮换的方式,并将每个轮换染成 \(1...x\) 的颜色的方案数,等价于一个一个地加点,每个点既可以选择新建一个轮换,有 \(x\) 种方案;又可以选择跟在之前的点的后面,方案是 \(0...n-1\)

感觉不够严谨?我们尝试用数学归纳法证明一下:

\[\begin{aligned} x^{\overline{n-1}}&=\sum_{i=0}^{n-1} \begin{bmatrix} n-1 \\ i \end{bmatrix}x^i \\ (n+x-1)x^{\overline{n-1}}&= \sum_{i=0}^{n}(n-1)\begin{bmatrix} n-1 \\ i \end{bmatrix}x^i+\sum_{i=0}^n\begin{bmatrix} n-1 \\ i \end{bmatrix}x^i \\ x^{\overline{n}} &= \sum_{i=0}^n\begin{bmatrix} n \\ i \end{bmatrix}x^i \end{aligned} \]

现在我们回到自然数幂和的问题。

\[\begin{aligned} S_k(n)&=\sum_{i=0}^{n-1}i^k\\ &= \sum_{i=0}^{n-1}i^{\overline{k}}-\sum_{j=0}^{k-1} \begin{bmatrix} k \\ j \end{bmatrix}i^j\\ &= k!\sum_{i=0}^{n-1}{i + k - 1 \choose k}-\sum_{i=0}^{n-1}\sum_{j=0}^{k-1} \begin{bmatrix} k \\ j \end{bmatrix}i^j\\ &= k! {k + n- 1 \choose k + 1}-\sum_{j=0}^{k-1}\begin{bmatrix} k \\ j \end{bmatrix}S_j(n)\\ &= \frac{(n-1)^{\overline{k+1}}}{k+1}-\sum_{j=0}^{k-1}\begin{bmatrix} k \\ j \end{bmatrix}S_j(n) \end{aligned} \]

直接递推即可。复杂度:\(O(k^2)\)。优势在于模数无需为质数

不喜欢上升幂?我们试一试下降幂:

首先应该知道:

\[\Large x^{\overline{n}}=(-1)^n(-x)^{\underline{n}} \]

\[\Large x^{\underline{n}}=(-1)^n(-x)^{\overline{n}} \]

(显然)

然后代入$x{\overline{n}}=\sum_{i=0}n \begin{bmatrix}
n\
i
\end{bmatrix} x^i $,硬把它搞成下降幂:

\[(-1)^n(-x)^{\underline{n}}=\sum_{i=0}^n \begin{bmatrix} n\\ i \end{bmatrix} x^i \]

\(-x\) 代替 \(x\)

\[\Large x^{\underline{n}}=\sum_{i=0}^n \begin{bmatrix} n\\ i \end{bmatrix} (-1)^{n-i}x^i\]

用这个搞一搞:

\[\begin{aligned} S_k(n)&=\sum_{i=0}^{n-1}i^k\\ &=\sum_{i=0}^{n-1}i^{\underline{k}}-\sum_{j=0}^{k-1}\begin{bmatrix} k\\ j \end{bmatrix}(-1)^{k-j}i^j\\ &= k!\sum_{i=0}^{n-1}{i \choose k}-\sum_{j=0}^{k-1}\begin{bmatrix} k\\ j \end{bmatrix}(-1)^{k-j}\sum_{i=0}^{n-1}i^j\\ &= k!{n \choose k + 1}-\sum_{j=0}^{k-1}\begin{bmatrix} k\\ j \end{bmatrix}(-1)^{k-j}S_j(n)\\ &= \frac{n^{\underline{k+1}}}{k+1}-\sum_{j=0}^{k-1}\begin{bmatrix} k\\ j \end{bmatrix}(-1)^{k-j}S_j(n)\\ \end{aligned} \]

同样直接递推即可。复杂度同样是 \(O(k^2)\)。优势同样在于模数无需为质数

posted @ 2020-08-24 15:13  JiaZP  阅读(203)  评论(0编辑  收藏  举报