【小结】拉格朗日插值法

我们都知道,给定不同的 \(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)\),可以通过。

posted @ 2026-08-21 16:33  GUO120822  阅读(1)  评论(0)    收藏  举报