拉格朗日插值

\(\text{By jr_zch}\)

概念

  • 求值:已知多项式 \(f(x)\),给定 \(k\),求 \(f(k)\) 的过程。

  • 插值:给定 \(n\) 个点对 \((x_i,y_i)\),求由它们组成的多项式 \(f(x)\) 的每一项的系数。

简介

拉格朗日的英语是 \(\text{Lagrange}\)

拉格朗日插值是一个有关多项式的算法,最朴素的用法就是快速解决用点对 \((x_i,y_i)\) 描述的多项式的单点求值和插值。

一般情况下,对于 \(n\) 次多项式,拉格朗日插值可以做到 \(O(n^2)\) 的单点求值和 \(O(n^2)\) 的插值。

如果使用分治 \(\text{FFT}\)\(\text{NTT}\) 等算法,时间复杂度可以被优化至 \(O(n \log_2^2 n)\)

在某些 \(x_i\) 特殊的情形,它可以做到总复杂度 \(O(n)\) 的单点求值。

算法内容

对于给定的 \(n\) 个点值 \((x_{1\sim n},y_{1\sim n})\) 求出多项式 \(F(x)\) 满足 \(\forall i \in [1,n],F(x_i)=y_i\)

先考虑对于单个点 \(i\),构造多项式 \(F_i(x)\) 满足 \(F_i(x_i)=y_i\)\(\forall j \not= i,F_i(x_j)=0\)

不难得到一种合法的构造是令 \(F_i(x)=y_i \prod_{j \not= i} \frac {x-x_j} {x_i-x_j}\)

那么就有:

\[\begin{aligned} &F(x)\\ =&\sum_{i=1}^n F_i(x)\\ =&\sum_{i=1}^n y_i \prod_{j \not= i} \frac {x-x_j} {x_i-x_j}\\ \end{aligned} \]

插值和单点求值的朴素实现均为 \(O(n^2)\)

但如果 \(x_1 \sim x_n\) 是连续整数,单点求值可以优化到 \(O(n)\)

例题

模板题就不放了,主要讨论一些有价值的题目。

自然数幂和

我们设 \(f_k(n)=n^k\)\(s_k(n)=1^k+2^k+3^k+\cdots+n^k=\sum_{i=1}^n f_k(i)\)

\(s_k\)\(f_k\) 的前缀和。

通过扰动法或差分法,都可以推出来一个朴素递推式:

\[s_i(n)=\frac 1 {i+1} (\sum_{j=0}^{i+1} n^j-1-\sum_{j=0}^{d-1} \binom{i+1}{j}s_j(n)) \]

暴力实现的复杂度是 \(O(k^2)\) 的,观察上式,当 \(j=i+1\) 的时候会产生最高次 \(n^{i+1}\) 的贡献,所以 \(s_i(n)\) 是关于 \(n\)\(i+1\) 次多项式。

我们要求的答案即为关于 \(n\)\(k+1\) 次多项式,暴力求出 \(n=1 \dots k+1\) 处的点值,在拉格朗日插值解决即可。

这道题可以说是模板题,但是带来了关于多项式的一些性质,当 \(f(i)\) 为关于 \(i\)\(k\) 次多项式,且 \(s(i)=\sum_{j=1}^{g(i)} f(j)\) 时:

  • \(g(i)\) 为关于 \(i\)\(1\) 次多项式,则有 \(s(i)\) 是关于 \(i\)\(k+1\) 多项式。

  • \(g(i)\) 为关于 \(i\)\(c\) 次多项式,则有 \(s(i)\) 是关于 \(i\)\(c(k+1)\) 多项式。

  • 特殊地,当 \(g(i)\) 是非多项式函数时,如 \(g(i)=\lfloor \frac i p \rfloor\)\(s(i)\) 也不是多项式,其中 \(p\) 为常数。

联合省选 \(2022\) 填树

发现没有什么突破点,考虑枚举最小值 \(x\),这样可选区间就固定为了 \([x,x+k]\),然后 \(O(n)\) 树形 \(\text{DP}\) 即可计算出对应的方案数和权值。

\(\text{DP}\) 过程中,如果直接用交集长度乘积作为答案会出现实际选择的权值中没有 \(x\) 的情况,可以考虑去给 \(\text{DP}\) 状态加一维。

但是更优雅的方式是用容斥,减掉权值范围在 \([x+1,x+k]\) 的方案数,用同样方式再算一遍即可。

然后用归纳法,易证答案是关于 \(x\) 的多项式,但由于每个点 \([l_i,r_i]\) 的限制,\(f(x)\) 是一个分段函数,每一段都是不同的多项式,所以每一段分别暴力 \(\text{DP}\) 计算 \(n\) 个点值,再拉插求总和即可。

\(\text{Finally}\)

拉插是属于工具的一类算法,大多数情况下用于优化 \(\text{DP}\) 和式子推出来之后套模板。

因此在做题时需要关注式子和方程等等是否是多项式形式。

总体来讲算是比较简单的一个知识点。

posted @ 2026-04-28 15:10  jr_zch  阅读(44)  评论(10)    收藏  举报