拉格朗日插值

吓得我都被拉格朗日了

小学知识可知,(n)个点((x_i,y_i))可以唯一地确定一个多项式

现在,给定(n)个点,请你确定这个多项式,并将(k)代入求值

求出的值对(998244353)取模

我们首先可以想到高斯消元

发现高斯消元是(O(n^3))的,我凉了

看一眼标题,查一波公式发现了拉格朗日它老人家留下的好东西:

拉格朗日插值法

假设多项式为(f(k)),有点值((x_i,y_i)),那么多项式在(k)点的取值为

[f(k)=sumlimits_{i=0}^{n}y_iprodlimits_{i e j}frac{k-x_j}{x_i-x_j} ]

这个式子是怎么推出来的呢?

这个您得问拉格朗日去 但是我们可以证明一下

(1.)分母不为(0):
当分母为(0)时当且仅当存在(x_i=x_j),那么如果(y_i=y_j)就是同一点,可以去重,如果(y_i e y_j),不满足函数性质
(2.)满足所有给定点值:
对于(k=x_i),当(sum)中的(x_i e k)时,其他项均存在(k-x_i=0),对于(x_i=k)时,满足(prod)中所有项均为(1),则最终答案为(y_i)

所以说它好像是对的,复杂度(O(n^2))

前缀积后缀积优化

(x_i)取值连续时,我们可以用前缀积后缀积优化到(O(n))

在连续时,我们把(x_i)替换为(i)得到

[f(k)=sumlimits_{i=0}^{n}y_iprodlimits_{i e j}frac{k-j}{i-j} ]

如果我们有(pre_i=prodlimits_{j=0}^{i}k-j)以及(suf_i=prodlimits_{j=i}^{n}k-j,fac_i=prodlimits_{j=1}^{i}j)

那么原式可以表示为

[f(k)=sumlimits_{i=0}^{n}y_ifrac{pre_{i-1}*suf_{i+1}}{fac_{i}*fac_{n-i}}*(-1)^{n-i} ]

重心拉格朗日插值

回到最初的起点:

[f(k)=sumlimits_{i=0}^{n}y_iprodlimits_{i e j}frac{k-x_j}{x_i-x_j} ]

这个式子是不通用的,每改变一个点值就要(O(n^2))地重新计算

我们做一个变形,设(g=prodlimits_{i=0}^{n}k-x_i)

[f(k)=gsumlimits_{i=0}^{n}frac{y_i}{k-x_i}prodlimits_{i e j}frac{1}{x_i-x_j} ]

(t_i=frac{y_i}{prodlimits_{i e j}x_i-x_j})

[f(k)=gsumlimits_{i=0}^{n}frac{t_i}{k-x_i} ]

每次修改或插入直接修改(t_i)就好了,注意重心插值不能处理(k=x_i)

例题

洛谷P4593 [TJOI2018]教科书般的亵渎

原文地址:https://www.cnblogs.com/knife-rose/p/12029276.html