定义与约定
\[\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)\)。优势同样在于模数无需为质数