拉格朗日插值
\(\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}\)。
那么就有:
插值和单点求值的朴素实现均为 \(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\) 的前缀和。
通过扰动法或差分法,都可以推出来一个朴素递推式:
暴力实现的复杂度是 \(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}\) 和式子推出来之后套模板。
因此在做题时需要关注式子和方程等等是否是多项式形式。
总体来讲算是比较简单的一个知识点。

浙公网安备 33010602011771号