吓得我都被拉格朗日了
由小学知识可知,(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)