拉格朗日插值负责搞这样一个问题:
有一个给了 n 个特定点值的 n - 1 次函数(并不给表达式),然后我随机给一个数,求其值。
如,给定 (1, 2), (4, 12), (123, 432) 的二次函数,求在函数上的点 (34433223, y) 的 (y) 的值。
方法
如果我们能构造一个函数,符合所有给定点都在函数图像上,那么该函数即为所求函数。
考虑类似中国剩余定理的方法:当我们带入其中一个点 (x_i) 的时候,要求 (y_i) 为给定值,那么我们考虑把对于每一个点的式子加一块,如果式子恰好是关于点 (i) 的,那么就让其值为给定的那个 (y_i);否则让其为 (0)。
对于加粗部分如何实现?和CRT一样,我们构造一种连乘式,其中第 (i) 个连乘式恰好不包含 (x_i)。 对于第 (i) 个式子,我们让连乘式中所有的式子都为1;对于其它的式子,我们让连乘式中的某一项为0.
重点!!!
背过!!
假设我们给了个 (x_i),那么当第一层循环不为 (i) 的时候,一定存在一个 (j),使得 (x) 自己减自己,这样连乘式中一项为0,故有 (prod _ {j ot= i} x-x_j);第一层循环到 (i) 的时候,要求那个连乘式一定为1,因此除一下 (x_i - x_j) 即可,即 (prod frac{x-x_j}{x_i-x_j})。
构造好式子以后,我们代入其它的 (x) 得到的 (y) 也就一定符合这个函数了。
单次复杂度:(O(n^2))
背过!!
例题
P4781 【模板】拉格朗日插值
T130226 一起学习的日子(study)
题意:
求:
其中 (k <= 3000,n,a,d<=1e9)
题解:
我们知道:
1 + 1 + 1 + ... + 1 可以表示为一次多项式(n),
1 + 2 + 3 + ... + n 的值可以表示为二次多项式((n * (n + 1) / 2));
(1^2 + 2^2 + 3^2 + ... + n^2) 可以表示为三次多项式((n * (n + 1) * (2 * n + 1) / 6))。
那么我们猜测 (1^k + 2^k + ... + n^k) 可以表示为 (n + 1) 次多项式。
我们进而猜测:
(sum_{l=1}^j{l^k}) 为 (k + 1) 次多项式;----①
(sum_{j=1}^{i}sum_{l=1}^j{l^k}) 是 (k + 2) 次多项式;------②
(sum_{i=0}^{n}sum_{j=1}^{a+i* d}sum_{l=1}^j{l^k}) 是 (k + 3) 次多项式。-----③
我们还发现,①②的计算方法不是很复杂,也就是说,算出②的拉格朗日插值的表达式所需的(k+...) 个 ((x_i, y_i)) 其实可以直接暴力前缀和算出。而③不行。因此我们对于③,使用拉格朗日插值依次算出其前 (k + 4) 个值,然后再用拉格朗日插值算出第 (n) 项的值。
复杂度: (O(k^3))。
优化:因为 (x_i = i),我们发现那个连乘式的分子和分母对于不同的 (i) 有大量重复,分母本质上是两个阶乘(分正负数讨论),分子可以直接预处理出前缀积和后缀积。然后拉格朗日插值优化为单次 (O(n))。
CF622F The Sum of the k-th Powers
经典问题:O(klogP)求 (sum_{i=1}^{n}i^k)。方法和优化同上。
P4593 [TJOI2018]教科书般的亵渎
转化后转变成求 (sum_{i=1}^{n}i^k) 的问题。
注意:
一定记得对负数进行 +P!!!