自然数幂和

一,常见自然数幂和

1

\[\begin{aligned} \sum_{i = 1}^{n} i^0 &= \sum_{i = 1}^{n} 1 \\ &= n \\ \end{aligned} \]

2

\[\begin{aligned} \sum_{i = 1}^{n} i^1 &= \sum_{i = 0}^{n} \binom{i}{1} \\ &\textbf{由恒等式} \sum_{i = 0}^{n} \binom{i}{m} = \binom{n + 1}{m + 1} \textbf{有} \\ &= \binom{n + 1}{2} \\ &= \frac{(n + 1)n}{2} \\ \end{aligned} \]

3

\[\begin{aligned} \sum_{i = 1}^{n} i^2 &= \sum_{i = 1}^{n} (i(i - 1) + i) \\ &= 2 \sum_{i = 1}^{n} \frac{i(i - 1)}{2} + \sum_{i = 1}^{n} i \\ &= 2 \sum_{i = 0}^{n} \binom{i}{2} + \sum_{i = 0}^{n} \binom{i}{1} \\ &= 2 \binom{n + 1}{3} + \binom{n + 1}{2} \\ &= \frac{2(n + 1)n(n-1)}{6} + \frac{(n + 1)n}{2} \\ &= \frac{2(n + 1)n(n-1)}{6} + \frac{3(n + 1)n}{6} \\ &= \frac{(n + 1)n(2(n-1) + 3)}{6} \\ &= \frac{n(n+1)(2n + 1)}{6} \\ \end{aligned} \]

4

4.1.

\[\begin{aligned} \sum_{i = 1}^{n} i^3 &= \sum_{i = 1}^{n} ((i - 1)i(i + 1) + i) \\ &= 6 \sum_{i = 1}^{n} \frac{(i + 1) i (i - 1)}{6} + \sum_{i = 1}^{n} i \\ &= 6 \sum_{i = 0}^{n} \binom{i + 1}{3} + \sum_{i = 0}^{n} \binom{i}{1} \\ &= 6 \binom{i + 2}{4} + \binom{i + 1}{2} \\ &= \frac{6(n + 2)(n + 1)n(n - 1)}{24} + \frac{(n + 1)n}{2} \\ &= \frac{(n + 2)(n + 1)n(n - 1)}{4} + \frac{2(n + 1)n}{4} \\ &= \frac{(n + 1)n((n + 2)(n - 1) + 2)}{4} \\ &= \frac{(n + 1)n(n^2 + n)}{4} \\ &= \frac{(n + 1)^2 n^2}{4} \\ \end{aligned} \]

4.2. 巧合地有

\[\sum_{i = 1}^{n} i^3 = (\sum_{i = 1}^{n} i)^2 \]

二,自然数幂和

2.1 组合求幂和

2.1.1. 形如

\[S_k(n) = \sum_{i = 1}^{n} i^k\ s.t.\ i \geq 1 \]

的多项式被称为自然数幂合

(自然数幂和被提出时不认为 \(0\) 是自然数,不符合皮亚诺公理系统

2.1.2 二项式定理

已知二项式定理

\[(a + b)^k = \sum_{i = 0}^{k} \binom{k}{i} a^i b^{k - i}\ s.t.\ (k \geq 1) \]

特殊地有

\[(a + 1)^k = \sum_{i = 0}^{k} \binom{k}{i} a^i \]

由此可以得到恒等式

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

2.1.3 利用二项式定理差分

有一个非常好的想法是利用差分

\[\begin{aligned} (n + 1)^{k + 1} - n^{k + 1} &= \sum_{i = 0}^{k} \binom{k + 1}{i} n^i \\ n^{k + 1} - (n - 1)^{k + 1} &= \sum_{i = 0}^{k} \binom{k + 1}{i} (n - 1)^i \\ \cdots \\ 2^{k + 1} - 1^{k + 1} &= \sum_{i = 0}^{k} \binom{k + 1}{i} 1^i \\ \end{aligned} \]

然后迭加有

\[\begin{aligned} (n + 1)^{k + 1} - 1 &= \sum_{i = 0}^{k} \sum_{j = 1}^{n} \binom{k + 1}{i} j^i \\ &= \sum_{i = 0}^{k} \binom{k + 1}{i} S_i (n) \\ &= \sum_{i = 0}^{k - 1} \binom{k + 1}{i} S_i(n) + (k + 1) S_k(n) \\ \end{aligned} \]

整理有

\[S_k(n) = \frac{(n + 1)^{k + 1} - 1 - \sum_{i = 0}^{k - 1} \binom{k + 1}{i} S_i(n)}{k + 1}\ s.t.\ k \geq 0 \]

\(k = 0\) 代入也满足通项。

2.1.4 从二项式定理变换

存在一种直接计算法:

\[\begin{aligned} S_{k + 1}(n) &= \sum_{i = 0}^{n} i^{k + 1} \\ &= \sum_{i = -1}^{n - 1} (i + 1)^{k + 1} \\ &= \sum_{i = 0}^{n - 1} (i + 1)^{k + 1} \\ &= \sum_{i = 0}^{n} (i + 1)^{k + 1} - (n+1)^{k + 1} \\ &= \sum_{i = 0}^{n} \sum_{j = 0}^{k + 1} \binom{k + 1}{j} i^{j} - (n + 1)^{k + 1} \\ &= \sum_{j = 0}^{k + 1} \binom{k + 1}{j} 0^{j} + \sum_{j = 0}^{k + 1} \binom{k + 1}{j} S_j(n) - (n + 1)^{k + 1} \\ &= 1 + \sum_{j = 0}^{k - 1} \binom{k + 1}{j} S_j(n) + S_{k + 1} (n) + (k + 1)S_k(n) - (n + 1)^{k + 1} \\ \end{aligned} \]

整理有

\[S_k(n) = \frac{(n + 1)^{k + 1} - 1 - \sum_{j = 0}^{k - 1} \binom{k + 1}{j} S_j(n)}{k + 1} \]

注意到公式中存在 \(0^{k}\) ,并注意到 \(0^0\) 从负数逼近没有意义,从正数逼近为 \(1\) 。在组合与数论中 \(0^0 = 1\)

可以通过 \(O(k^2)\) 的时间复杂度得到 \(S_k(n)\)

其中组合数预处理贡献和 \(S_k(n)\) 的计算复杂度都为 \(O(k)\) 。(\(k\) 动态变化,不能前缀和预处理)。

由于求解过程是一个递推式,于是我们可以通过 \(O(k^2 n)\) 打表以 \(O(1)\) 得到 \(S_i(n)\ s.t.\ (0 \leq i \leq k, n \geq 0)\)

上述两种推到过程可掌握一种。

2.2 拉格朗日插值求幂和

通过上述得到的自然数幂和组合递推公式,可以归纳出 \(S_k(n)\) 是一个关于 \(n\)\(k + 1\) 次多项式 \(S_k(n) = f(n) = a_{k + 1} n^{k + 1} + a_k n^{k} + \cdots a_0 n^0\)

其实大多数情况在竞赛现场不一定会严格归纳,可以由前一些项猜测出某个公式大概率是一个多项式并且猜出阶数。

范德蒙矩阵可证明 \(n + 1\) 个横坐标不同的点对可以唯一确定一个 \(n\) 次多项式。证略。

于是可以代入 \(k + 2\) 个点进行拉格朗日插值得到此 \(k + 1\) 次多项式。

2.2.1 拉格朗日插值

对于关于 \(x\)\(n\) 次多项式 \(f(x)\) ,可以由 \(n + 1\) 个横坐标不同的点对 \((x_0, y_0), (x_1, y_1), (x_2, y_2), \cdots, (x_n, y_n)\) 唯一确定。

于是可以由这些点对构造 \(n + 1\) 个多项式 \(f_0(x), f_1(x), f_2(x), \cdots, f_n(x)\) 。对于第 \(i\) 个多项式 \(f_i(x)\) 满足经过点

\[\begin{cases} (x_j, 0), j \neq i \\ (x_i, y_i) \\ \end{cases} \]

于是有

\[f(x) = \sum_{i = 0}^{n} f_i(x) \]

根据多项式的点值表示,显然 \(f(x)\) 会过给出的 \(n + 1\) 个点。

可以构造出

\[f_i(x) = y_i \prod_{j \neq i} \frac{x - x_j}{x_i - x_j} \]

正确性容易证明。当 \(x = x_i\) ,显然 \(f_i(x) = y_i \cdot 1\) 。由于此时 \(f_j(x)\ s.t. j \neq i\) 分子中存在因子 \(x_i - x_i\) ,于是 \(f_j(x) = 0\)

于是

\[f(x) = \sum_{i = 0}^{n} y_i \prod_{j \neq i} \frac{x - x_j}{x_i - x_j} \]

朴素求解的时间复杂度为 \(O(n^2)\) ,代入 \(k\) 即可解得 \(f(k)\)

现在 \(S_n(k)\) 可以被 \(O(k^2)\) 求解,似乎比 \(O(nk)\) 快了,但可以更快吗?

2.2.1.1 快速插值

此时让 \(n\) 为多项式的次数。

显然朴素插值在时间上没有优势,使用 \(NTT\) 可以 \(O(n \log^2 n)\) 插值。

只讨论最常见的情况:当选择的点值横坐标为连续 \(n + 1\) 个,可以 \(O(n)\) 插值。

2.2.1.1.1 选前 n + 1 个点的 O(n) 插值

可以假设选取的点值为 \((0, f(0)), (1, f(1)), (2, f(2)), \cdots, (n, f(n))\)

于是

\[\begin{aligned} f(x) &= \sum_{i = 0}^{n} y_i \prod_{j \neq i} \frac{x - x_j}{x_i - x_j} \\ &= \sum_{i = 0}^{n} y_i \prod_{j \neq i} \frac{x - j}{i - j} \\ \end{aligned} \]

显然累乘式可以前缀和优化。

观察累乘式分子

\[\begin{aligned} &(x - 0)(x - 1)(x - 2) \cdots (x - i + 1)(x - i - 1)(x - i - 2) \cdots (x - n) \\ = &\frac{\prod_{j = 0}^{n} (x - j)}{x - i} \end{aligned} \]

观察累乘式分母。存在一个正负交接

\[\begin{aligned} &(i - 0)(i - 1)(i - 2) \cdots (i - i + 1)(i - i - 1)(i - i - 2) \cdots (i - n) \\ = &\prod_{j = 1}^{i} j \times \prod_{j = 1}^{n - i} -j \\ = &i! \cdot (-1)^{n - i}(n - i)! \\ \end{aligned} \]

于是有

\[\begin{aligned} f(x) &= \sum_{i = 0}^{n} (-1)^{n - i} y_i \frac{\prod_{j = 0}^{n}(x - j)}{i! \cdot (n - i)!(x - i)} \\ &= \sum_{i = 0}^{n} \frac{(-1)^{n - i} y_i}{i! \cdot (n - i)!} \frac{\prod_{j = 0}^{n} (x - j)} {(x - i)} \\ \end{aligned} \]

其中 \(\frac{\prod_{j = 0}^{n} (x - j)}{x - i}\) 使用前后缀积即可 \(O(1)\) 预处理。

得到前 \(k + 2\) 项后可以以 \(O(k)\) 的时间复杂度进行插值。

现在还有一个遗留问题,如何得到 \((0, f(0)), (1, f(1)), (2, f(2)), \cdots, (k + 1, f(k + 1))\)

观察到 \(S_k(n) = \sum_{i = 1}^{n} i^k\) ,可知 \(S_k(n + 1) = S_k(n) + (n + 1)^k\) ,于是可以递推得到。

推出前 \(k + 2\) 个值的时间复杂度为 \(O(k \log k)\) ,其中 \((n + 1)^k\) 的快速幂贡献 \(\log k\) 的时间复杂度。

观察到 \(i^k\) 是一个积性函数,于是可以线性筛出 \(i^0, i^1, i^2, \cdots, i^{k + 1}\) 的值并维护一个前缀积,\(O(1)\) 得到 \(f(x_i)\)

2.2.1.1.2 积性函数

  1. 若函数 \(f(x)\) 满足

\[\begin{cases} f(1) = 1, \\ f(xy) = f(x) f(y), \quad x,y \in N^{*}, gcd(x, y) = 1 \\ \end{cases} \]

\(f(x)\)积性函数

  1. 若函数 \(f(x)\) 满足

\[\begin{cases} f(1) = 1, \\ f(xy) = f(x) f(y), \quad x,y \in N^{*} \\ \end{cases} \]

\(f(x)\)完全积性函数

显然幂函数 \(i^k\)完全积性函数满足 \(a^k \times b^k = (ab)^k\ s.t.\ a,b \in N^*\)

2.2.1.1.2 筛法

2.2.1.1.2.1 埃氏筛

埃氏筛的原理朴实:即枚举 \(1 ~ n\) ,若当前为质数,则将它所有 \(\leq n\) 的倍数筛掉。

问题在于如何判断质数?若枚举到 \(i\) 且没被筛过,则 \(i\) 就是质数。证明显然: 没被筛过的数没有质因子。

埃氏筛时间复杂度可以通过放缩和夹逼定理构造性证明,为 \(O(n \log \log n)\) 。证略。

存在许多埃氏筛的优化,但依旧达不到线性。(且埃氏筛 \(O(n \log \log n)\) 已经不算慢了)

不难发现埃氏筛的一个合数会被他的所有质因子访问一次,存在重多次筛去。若有一种办法让每个合数只被它的质因子访问一次,则可达到线性筛法。

2.2.1.1.2.2 线性筛(欧拉筛)

非常重要

线性筛的原理为每个合数只会被他的最小质因子筛去一次。

算法运行流程为:

枚举 \(1 \sim n\) ,设当前指针在 \(i\) ,设 \(p_j(j \leq i)\)\(j\) 的最小质因子,\(S\) 为已经确定的质因子集合。

\(i\) 未被筛过,将 \(i\) 加入 \(S\) 。正确性已证。

从小到大枚举 \(x \in S\ s.t. i \times x \leq n, x \leq p_i\) ,将 \(i \times x\) 筛去,维护 \(p_{i \times x} = x\)

正确性证明:

  1. \(\forall x' > p_i\) ,显然 \(p_{i \times x'} = p_i < x'\)
  2. \(\forall x' \leq p_i\) ,要证 \(p_{i \times x'} = x'\) ,只需证 \(p_{i \times x'} \neq x'\)\(\exists x' \leq p_i\) 矛盾。
    那么假设 \(\exists x' \leq p_i, p_{i \times x'} \neq x'\) 。显然 \(\nexists p_{i \times x'} > x'\) ,否则违反良序原理。即假设为 \(\exists a < x', i \times x' = a x' b\ s.t.\ a < x \leq b\) 。于是 \(p_{i} \leq a < x'\) ,则 \(\nexists x' \leq p_{i}\)
    qed

时间复杂度证明:
已知算法正确。每个质因子只在枚举时被确定一次。每个合数除了在枚举时被访问一次,只会被它的最小质因子筛去一次。时间复杂度为 \(O(n)\)

由于线性筛的原理,让它可以且通常用来筛积性函数。

局限性是需要严格连续的前缀,在一些特殊场景如区间筛中,无法取代埃氏筛的作用。

2.2.1.1.3 区间筛

2.2.1.1.4 线性筛筛积性函数

根据线性筛的性质,每个合数 \(m\) 被它的最小质因子 \(p_m\) 筛掉。

于是

  1. 每个质因子独立进行积性函数计算
  2. 在筛合数的算法时主要进行积性函数乘法计算。当前枚举到质因子 \(x \ s.t.\ i * x \leq n, x \leq p_i\)
    在筛完全积性函数时可直接计算。
    在筛非完全积性函数需要讨论是否 \(p_i\)\(x\) ,需要注意不互质时的非乘法运算。

对于一般的积性函数 \(f(x)\) ,如果上述第二步可以 \(O(1)\) 计算,则可以 \(O(n)\) 复杂度筛出 \(f(0), f(1), \cdots, f(n)\)

如幂函数 \(f_k(n) = n^k\) ,当考虑到 \(i\) 有:

\[\begin{aligned} if \ (!p_i) \quad clac(i) = qpow(i, k) \end{aligned} \]

枚举已有质因子

\[\begin{aligned} p_{i * pr_j} &= pr_j \\ g_{i * pr_j} &= g_i * g_{pr_j} \\ \end{aligned} \]

2.2.1.1.5 质数定理

由质数定理,第 \(n\) 个质数趋近 \(n \ln n\) ,则约有 \(\frac{n}{\ln n}\) 个质数 \(\leq n\) 。证略。

在线性筛筛幂函数 \(i^k\) 过程中,\(k + 1\) 内共能筛出 \(\frac{k}{\ln k}\) 个质数,每个质数求快速幂的复杂度为 \(\log k\) ,于是计算积性函数的时间复杂度为 \(O(\frac{k}{\ln k} log k) = O(k \frac{log k}{\log k / \log e}) = O(k \log e) = O(k)\) 。线性筛时间复杂度为 \(O(k)\) ,于是筛积性函数的复杂度为 \(O(k)\)

筛积性函数的时间复杂度和拉格朗日插值的时间复杂度都为 \(O(k)\) ,于是总时间复杂度为 \(O(k)\)

相应的,对于积性函数的变量,若质因子的计算低于 \(O(\log n)\) ,合数的计算低于 \(O(1)\) ,即可线性筛出。

例题们:
线性逆元板子:https://www.luogu.com.cn/problem/P3811
拉格朗日插值板子1 \(O(k^2)\) (k 是多项式次数):https://www.luogu.com.cn/problem/P4781
拉格朗日插值板子2 \(O(k)\) (k 是多项式次数):https://www.luogu.com.cn/problem/P5667 (插值的连续点平移,需要 NTT 一下,参考 https://www.cnblogs.com/zsxuan/p/18057194)
自然数幂和 \(O(k^2)\) 递推或插值 (k 是多项式次数):http://oj.daimayuan.top/course/22/problem/1106
自然数幂和 \(O(k)\) 快速插值(k 是多项式次数):https://www.luogu.com.cn/problem/CF622F
拉格朗日插值水题 1 :https://www.luogu.com.cn/problem/P4593
拉格朗日插值水题 2 :https://vjudge.net/problem/BZOJ-3453
拉格朗日插值水题 3 :https://www.luogu.com.cn/problem/P3270
拉格朗日插值水题 4 :https://vjudge.net/problem/BZOJ-2655
欧拉筛板子:https://www.luogu.com.cn/problem/P1069
区间筛(埃氏筛应用):http://oj.daimayuan.top/course/21/problem/521
线性筛板子:http://oj.daimayuan.top/course/21/problem/517
线性筛水题 1 :https://www.luogu.com.cn/problem/P8795
线性筛水题 2 :https://www.luogu.com.cn/problem/P4139 (用到 ExEula 定理,参考 https://www.cnblogs.com/zsxuan/p/18057185)
线性筛水题 3 :https://www.luogu.com.cn/problem/P2158
线性筛水题 4 :https://www.luogu.com.cn/problem/solution/P1390
线性筛水题 5 :https://www.luogu.com.cn/problem/solution/P2155
线性筛水题 6 :https://www.luogu.com.cn/problem/solution/P2568
线性筛水题 7 :https://www.luogu.com.cn/problem/solution/P3601
线性筛水题 8 :https://www.luogu.com.cn/problem/B3716
线性筛水题 9 :https://www.luogu.com.cn/problem/solution/P3747 (附赠线段树典:9.0 https://www.luogu.com.cn/problem/solution/P4145)

题解报告:
https://www.cnblogs.com/zsxuan/p/18083938

posted @ 2024-02-16 04:08  zsxuan  阅读(54)  评论(0编辑  收藏  举报