【小结】拉格朗日插值法
我们都知道,给定不同的 \(n+1\) 个点,就能确定一个 \(n\) 次多项式。
那么如何给出一个构造呢?
拉格朗日插值法就是一个巧妙的构造方法。
普通拉格朗日插值
若给出了 \(n\) 个点,分别为 \(x_i,y_i\)。
下面给出构造:
\(f(k)=\sum_{i=0}^{n} y_i\prod_{j\neq i} \frac{k-x_j}{x_i-x_j}\)。
对于每一个 \(x_p\),\(f(x_p)=\sum_{i=0}^{n} y_i\prod_{j\neq i} \frac{x_p-x_j}{x_i-x_j}\)。
那么对于 \(i\neq p\),后面那一坨乘积就存在一个 \(j=p\),所以分子为 \(0\)。所以乘积为 \(0\),也就没有贡献。
对于 \(i=p\),后面的分子就是 \(x_i-x_j\),所以乘积为 \(1\)。
所以最后总和是 \(y_i\)。
所以这个构造是正确的。
时间复杂度:\(\mathcal O(n^2)\)。
连续拉格朗日插值
对于这个自变量连续的情况,可以写成 \(f(k)=\sum_{i=1}^{n} y_i\prod_{j\neq i} \frac{k-j}{i-j}\)。
此时可以预处理 \(pre_i,suf_i\) 以及 \(fac_i\),分别表示 \(\prod_{j=1}^{i} (k-j),\prod_{j=i}^{n} (k-j)\) 和 \(i!\)。
此时式子就变成了 \(\sum_{i=0}^{n} y_i\frac{pre_{i-1}suf_{i+1}}{fac_{i-1}fac_{n-i}}\),时间复杂度也就变成了 \(\mathcal O(n\log V)\)。注意如果 \(n-i\) 是奇数的话需要变换一下符号。
重心拉格朗日插值
首先还是看这个式子。
\(f(k)=\sum_{i=1}^{n} y_i\prod_{j\neq i} \frac{k-x_j}{x_i-x_j}\)。
令 \(g=\prod_{i=1}^{n} (k-x_i)\),于是 \(f(k)=\sum_{i=1}^{n}\frac{y_i}{\prod_{j\neq i}(x_i-x_j)}\frac{g}{k-x_i}\)。
令 \(t_i=\frac{y_i}{\prod_{j\neq i}(x_i-x_j)}\),那么 \(f(k)=g\sum_{i=1}^{n} \frac{t_i}{k-x_i}\)。
这个式子的好处就是,每次如果加入一个点,可以计算他的 \(t_i\),然后直接加入到贡献。
时间复杂度:\(\mathcal O(n^2)\)。
应用
最典的一个引用就是 CF622F。
求 \(\sum_{i=1}^{n} i^k\),其中 \(1\leq n\leq 10^9,0\leq k\leq 10^6\)。
可以证明 \(\sum_{i=1}^{n} i^k\) 是一个关于 \(n\) 的 \(k+1\) 次多项式。
于是我们只需要取前 \(k+2\) 项 \((x,y)\),就可以求出 \(f(n)\)。
但是我们考虑 \(\mathcal O(k^2)\) 显然是不行的,这就得用到上面的连续优化了。
最终时间复杂度:\(\mathcal O(k\log n)\),可以通过。

浙公网安备 33010602011771号