前 n 个正整数的 k 次幂之和为什么是 k+1 次多项式
我们从 CF622F The Sum of the k-th Powers 一题说起。
题目为给定
如果我们能够确定「前
令
- 我们将两个
k + 1 次多项式(n + 1)^{k + 1} 与n^{k + 1} 相减,得到:\begin{aligned}(n + 1)^{k + 1}-n^{k + 1} &= \sum_{i = 0}^{k + 1}\left({\begin{matrix}k + 1 \\ i\end{matrix}}\right)n^i - n^{k + 1} \\ &= \sum_{i = 0}^k\left({\begin{matrix}k + 1 \\ i\end{matrix}}\right)n^i \end{aligned}\ \ \ \ \ \ \ \ \ \ \ \cdots(1) 其中,(n + 1)^{k + 1} = \sum_{i = 0}^{k + 1}\left(^{k + 1} _ {\ \ \ i\ \ \ }\right)n^i 用到了二项式定理。 - 多项式
n^{k + 1} 与(n - 1)^{k + 1} 相减,得到:n^{k + 1} - (n - 1)^{k + 1} = \sum_{i = 0}^k \left({\begin{matrix}k + 1 \\ i\end{matrix}}\right)(n - 1)^i\ \ \ \ \ \ \ \ \ \ \ \ \cdots(2) -
\cdots - 多项式
1^{k + 1} 与0^{k + 1} 相减,得到1^{k + 1} - 0^{k + 1} = \sum_{i = 0}^k\left({\begin{matrix}k + 1 \\ i\end{matrix}}\right)0^i \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \cdots(n + 1) - 将式子
(1), (2), \cdots ,(n + 1) 相加,得到(n + 1)^{k + 1} = \sum_{i = 0}^{k}\left({\begin{matrix}k + 1 \\ i\end{matrix}}\right)S(n, i)
由此,我们便不难得到
CF622F 一题代码如下(由于没有预处理阶乘的逆元,因此该代码的时间复杂度多了一个
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e6 + 10, P = 1e9 + 7;
int qpow(int v, int p) {
int e = 1;
for (; p; p >>= 1, v = 1ll * v * v % P) if (p & 1) e = 1ll * e * v % P;
return e;
}
int n, k, fac[maxn], l[maxn], r[maxn];
int lagrange(int v) {
l[0] = r[k + 3] = 1;
for (int i = 1; i <= k + 2; i++) l[i] = (1ll * l[i - 1] * (v - i) % P + P) % P;
for (int i = k + 2; i >= 1; i--) r[i] = (1ll * r[i + 1] * (v - i) % P + P) % P;
int res = 0, tmp = 0;
for (int i = 1; i <= k + 2; i++) {
tmp = (tmp + qpow(i, k)) % P;
int w = (1ll * tmp * l[i - 1] % P * r[i + 1] % P * qpow(1ll * fac[i - 1] * fac[k + 2 - i] % P, P - 2) * (k + 2 - i & 1 ? -1 : 1) % P + P) % P;
res = (res + w) % P;
}
return res;
}
int main() {
scanf("%d%d", &n, &k);
fac[0] = 1;
for (int i = 1; i <= k + 2; i++) fac[i] = 1ll * fac[i - 1] * i % P;
printf("%d\n", lagrange(n));
return 0;
}