拉格朗日插值法
题目描述
由小学知识得: \(n + 1\) 个 \(x\) 坐标不同的点确定唯一的最高次为 \(n\) 次的多项式 \(y = f(n)\) 。现在给出 \(n + 1\) 个点,求出这些点构成的多项式在某一位置的取值
拉格朗日插值法
假设给出的曲线是个二次多项式
现在有三个已经确定的点 \((x_1, y_1)\) ,\((x_2, y_2)\) , \((x_3, y_3)\)
代入柿子
很显然可以用高斯消元求出 \(a,b,c\) , 时间复杂度 \(O(n^3)\)
但拉格朗日插值法只需要 \(n^2\)
神奇的构造:
我们需要构造三条曲线 \(f_1,f_2,f_3\)
- 对于第一条曲线 \(f_1(x)\)
令 \(f_1(x_1) = 1, f_1(x_2) = f_1(x_3) = 0\)
- 对于第二条曲线 \(f_2 (x)\)
令 \(f_2(x_2) = 1, f_2(x_1) = f_2(x_3) = 0\)
- 对于第三条曲线 \(f_3(x)\)
令 \(f_3(x_3) = 1, f_3(x_1) = f_3(x_2) = 0\)
然后
-
\(y_1f_1(x)\) 就能保证在 \(x_1\) 处为 \(y_1\) ,\(x_2,x_3\) 处为取值为 0
-
\(y_2f_2(x)\) 就能保证在 \(x_2\) 处为 \(y_2\) ,\(x_1,x_3\) 处为取值为 0
-
\(y_3f_3(x)\) 就能保证在 \(x_3\) 处为 \(y_3\) ,\(x_1,x_2\) 处为取值为 0
再然后
神奇 发现这三条曲线就求出了想要的那条曲线
推导
对于上面的三条曲线显然满足性质
然后构造出这么个柿子
进一步推广
然后就有了
x 取值连续时
当题目要用到的 x 取值是连续的,上面的柿子可以优化到 \(O(n)\)
先列出柿子
考虑 \(O(1)\) 求出 \(\prod_{j \neq i}\frac{x_k - x_j}{x_i - x_j}\)
维护 \(x_k\) 的前缀积和后缀积
对于分母,就是个阶乘形式,柿子就成了
坑:当 \(n - i\) 为奇数的时候分母为负值
CF622F The Sum of the k-th Powers
重心拉格朗日插值法
有毒瘤题目会随时增加或者减少差值点,这个时候曲线就会改变,上面的柿子就需要重新计算了,那么上面的复杂度就会退化成 \(n^3\) 于是就有了重心拉格朗日插值 (好像牛顿插值法也可以办到 = =)
还是前面的柿子
令 $g = \prod_{i = 1}^{n}(x - x_i),t(i) = \prod_{i\neq j}(x_i - x_j) $
然后柿子就成了
对于每加入或减少一个点,可以只 \(O(n)\) 更新 \(t(i)\)
对于求值,可以 \(O(n)\) 求出 g,然后套公式就好了
预处理出逆元
时间复杂度 \(O(n)\)
参考资料