拉格朗日插值

拉格朗日插值负责搞这样一个问题:

有一个给了 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.

重点!!!

\[\Huge f(x) = \sum_{i=1}^{n}y_i*\prod_{1<=j<=n,j \not=i}\frac{x-x_j}{x_i-x_j} \]

背过!!

假设我们给了个 \(x_i\),那么当第一层循环不为 \(i\) 的时候,一定存在一个 \(j\),使得 \(x\) 自己减自己,这样连乘式中一项为0,故有 \(\prod _ {j \not= i} x-x_j\);第一层循环到 \(i\) 的时候,要求那个连乘式一定为1,因此除一下 \(x_i - x_j\) 即可,即 \(\prod \frac{x-x_j}{x_i-x_j}\)

构造好式子以后,我们代入其它的 \(x\) 得到的 \(y\) 也就一定符合这个函数了。

单次复杂度:\(O(n^2)\)

背过!!

\[\Huge f(x) = \sum_{i=1}^{n}y_i*\prod_{1<=j<=n,j \not=i}\frac{x-x_j}{x_i-x_j} \]

例题

P4781 【模板】拉格朗日插值

my record

T130226 一起学习的日子(study)

题意:

求:

\[\sum_{i=0}^{n}\sum_{j=1}^{a+i* d}\sum_{l=1}^j{l^k} mod ~ 123 45 67 891 \]

其中 \(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)\)

my record

CF622F The Sum of the k-th Powers

经典问题:O(klogP)求 \(\sum_{i=1}^{n}i^k\)。方法和优化同上。

my record

P4593 [TJOI2018]教科书般的亵渎

转化后转变成求 \(\sum_{i=1}^{n}i^k\) 的问题。

my record

注意:

一定记得对负数进行 +P!!!

posted @ 2020-08-23 19:11  JiaZP  阅读(213)  评论(0编辑  收藏  举报