自然数幂和
O ( k 2 ) O(k^2) O(k2)递推做法
首先令
S
(
n
,
k
)
=
∑
i
=
1
n
i
k
S(n,k)=\sum_{i=1}^{n}i^k
S(n,k)=∑i=1nik,那么我们把
S
(
n
,
k
+
1
)
S(n,k+1)
S(n,k+1)给拆开,可以得到如下的方程:
S
(
n
,
k
+
1
)
=
∑
i
=
1
n
i
k
+
1
S
(
n
,
k
+
1
)
=
∑
i
=
2
n
(
i
−
1
+
1
)
k
+
1
+
1
S
(
n
,
k
+
1
)
=
∑
j
=
0
k
+
1
(
k
+
1
j
)
∑
i
=
1
n
−
1
i
j
+
1
S
(
n
,
k
+
1
)
=
∑
j
=
0
k
+
1
(
k
+
1
j
)
(
S
(
n
,
j
)
−
n
j
)
+
1
S
(
n
,
k
+
1
)
=
∑
j
=
0
k
−
1
(
k
+
1
j
)
(
S
(
n
,
j
)
−
n
j
)
+
(
k
+
1
)
(
S
(
n
,
k
)
−
n
k
)
+
(
S
(
n
,
k
+
1
)
−
n
k
+
1
)
+
1
(
k
+
1
)
S
(
n
,
k
)
=
n
k
+
1
+
(
k
+
1
)
n
k
−
1
−
∑
j
=
0
k
−
1
(
k
+
1
j
)
(
S
(
n
,
j
)
−
n
j
)
S
(
n
,
k
)
=
n
k
+
1
−
∑
j
=
0
k
−
1
(
k
+
1
j
)
(
S
(
n
,
j
)
−
n
j
)
−
1
k
+
1
+
n
k
\begin{aligned} S(n,k+1) & =\sum_{i=1}^{n}i^{k+1} \\ S(n,k+1) & =\sum_{i=2}^{n}(i-1+1)^{k+1}+1\\ S(n,k+1) & =\sum_{j=0}^{k+1}\binom{k+1}{j}\sum_{i=1}^{n-1}i^j+1\\ S(n,k+1) & =\sum_{j=0}^{k+1}\binom{k+1}{j}(S(n,j)-n^j)+1\\ S(n,k+1) & =\sum_{j=0}^{k-1}\binom{k+1}{j}(S(n,j)-n^j)+(k+1)(S(n,k)-n^k)+(S(n,k+1)-n^{k+1})+1\\ (k+1)S(n,k) & =n^{k+1}+(k+1)n^k-1-\sum_{j=0}^{k-1}\binom{k+1}{j}(S(n,j)-n^j)\\ S(n,k)& =\frac{n^{k+1}-\sum_{j=0}^{k-1}\binom{k+1}{j}(S(n,j)-n^j)-1}{k+1}+n^k\\ \end{aligned}
S(n,k+1)S(n,k+1)S(n,k+1)S(n,k+1)S(n,k+1)(k+1)S(n,k)S(n,k)=i=1∑nik+1=i=2∑n(i−1+1)k+1+1=j=0∑k+1(jk+1)i=1∑n−1ij+1=j=0∑k+1(jk+1)(S(n,j)−nj)+1=j=0∑k−1(jk+1)(S(n,j)−nj)+(k+1)(S(n,k)−nk)+(S(n,k+1)−nk+1)+1=nk+1+(k+1)nk−1−j=0∑k−1(jk+1)(S(n,j)−nj)=k+1nk+1−∑j=0k−1(jk+1)(S(n,j)−nj)−1+nk
那么就可以递推了。
O ( k 2 ) O(k^2) O(k2)预处理,单次计算 O ( k ) O(k) O(k)
首先有第二类斯特林数普通幂转下降幂: x k = ∑ i = 0 k { n i } x i ‾ x^k=\sum_{i=0}^{k} \begin{Bmatrix}n\\i\end{Bmatrix}x^{\underline{i}} xk=∑i=0k{ni}xi。
把
S
(
n
,
k
)
S(n,k)
S(n,k)拆开:
S
(
n
,
k
)
=
∑
i
=
1
n
i
k
=
∑
i
=
1
n
∑
j
=
0
k
{
k
j
}
i
j
‾
=
∑
j
=
0
k
{
k
j
}
∑
i
=
1
n
i
j
‾
=
∑
j
=
0
k
{
k
j
}
∑
i
=
1
n
(
i
+
1
)
j
+
1
‾
−
i
j
+
1
‾
j
+
1
=
∑
j
=
0
k
{
k
j
}
(
n
+
1
)
j
+
1
‾
−
1
j
+
1
\begin{aligned} S(n,k) & =\sum_{i=1}^{n}i^k\\ & = \sum_{i=1}^{n}\sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}i^{\underline{j}}\\ & = \sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}\sum_{i=1}^{n}i^{\underline{j}}\\ & = \sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}\sum_{i=1}^{n}\frac{(i+1)^{\underline{j+1}}-i^{\underline{j+1}}}{j+1}\\ & = \sum_{j=0}^{k}\begin{Bmatrix}k\\j\end{Bmatrix}\frac{(n+1)^{\underline{j+1}}-1}{j+1} \end{aligned}
S(n,k)=i=1∑nik=i=1∑nj=0∑k{kj}ij=j=0∑k{kj}i=1∑nij=j=0∑k{kj}i=1∑nj+1(i+1)j+1−ij+1=j=0∑k{kj}j+1(n+1)j+1−1
于是就可以轻松的计算了。
O ( k log k ) O(k \log k) O(klogk)预处理出同一个 n n n的 1 1 1至 k k k次自然数幂和
还是推式子:
∑
i
=
1
n
i
k
=
∑
i
=
0
n
e
i
x
[
x
k
k
!
]
−
[
k
=
0
]
=
[
x
k
k
!
]
e
(
n
+
1
)
x
−
1
e
x
−
1
−
[
k
=
0
]
\sum_{i=1}^{n} i^k =\sum_{i=0}^{n}e^{ix}[\frac{x^k}{k!}]-[k=0]=[\frac{x^k}{k!}]\frac{e^{(n+1)x}-1}{e^x-1}-[k=0]
i=1∑nik=i=0∑neix[k!xk]−[k=0]=[k!xk]ex−1e(n+1)x−1−[k=0]
上面这个式子关于
e
e
e的项直接展开即可,然后多项式求逆搞一下就没了。