题目描述#
由小学知识得: n+1 个 x 坐标不同的点确定唯一的最高次为 n 次的多项式 y=f(n) 。现在给出 n+1 个点,求出这些点构成的多项式在某一位置的取值
拉格朗日插值法#
假设给出的曲线是个二次多项式
f(x)=ax2+bx+c
现在有三个已经确定的点 (x1,y1) ,(x2,y2) , (x3,y3)
代入柿子
⎧⎪⎨⎪⎩f(x1)=ax21+bx1+cf(x2)=ax22+bx2+cf(x3)=ax23+bx3+c
很显然可以用高斯消元求出 a,b,c , 时间复杂度 O(n3)
但拉格朗日插值法只需要 n2
神奇的构造:
我们需要构造三条曲线 f1,f2,f3
令 f1(x1)=1,f1(x2)=f1(x3)=0
令 f2(x2)=1,f2(x1)=f2(x3)=0
令 f3(x3)=1,f3(x1)=f3(x2)=0
然后
-
y1f1(x) 就能保证在 x1 处为 y1 ,x2,x3 处为取值为 0
-
y2f2(x) 就能保证在 x2 处为 y2 ,x1,x3 处为取值为 0
-
y3f3(x) 就能保证在 x3 处为 y3 ,x1,x2 处为取值为 0
再然后
f(x)=y1f1(x)+y2f2(x)+y3f3(x)
神奇 发现这三条曲线就求出了想要的那条曲线
推导
对于上面的三条曲线显然满足性质
fi(xj)={1 (i=j)0 (i≠j)
然后构造出这么个柿子
f1(x)=(x−x2)(x−x3)(x1−x2)(x1−x3)
进一步推广
fi(x)=j≤n∏j≠ix−xjxi−xj
然后就有了
f(x)=i=n∑i=1yi∗fi(x)
P4781 【模板】拉格朗日插值
code
x 取值连续时#
当题目要用到的 x 取值是连续的,上面的柿子可以优化到 O(n)
先列出柿子
f(k)=i=n∑i=1yi∗j≤n∏j≠ixk−xjxi−xj
考虑 O(1) 求出 ∏j≠ixk−xjxi−xj
维护 xk 的前缀积和后缀积
prei=i∏j=0(xk−xj)sufi=n∏j=i(xk−xj)
对于分母,就是个阶乘形式,柿子就成了
f(k)=n∑i=0yiprei−1∗sufi+1faci∗facn−i
坑:当 n−i 为奇数的时候分母为负值
CF622F The Sum of the k-th Powers
code
重心拉格朗日插值法#
有毒瘤题目会随时增加或者减少差值点,这个时候曲线就会改变,上面的柿子就需要重新计算了,那么上面的复杂度就会退化成 n3 于是就有了重心拉格朗日插值 (好像牛顿插值法也可以办到 = =)
还是前面的柿子
f(x)=n∑i=1yi∏i≠jx−xjxi−xj =n∑i=1yi∏i≠jx−xj∏i≠jxi−xj =n∑i=1yi∏ni=1(x−xi)∏i≠j(xi−xj)∗(x−xi) =n∏i=1(x−xi)n∑i=1yi∏i≠j(xi−xj)∗(x−xi)
令 g=∏ni=1(x−xi),t(i)=∏i≠j(xi−xj)
然后柿子就成了
f(x)=gn∑i=1yi(x−xi)∗t(i)
对于每加入或减少一个点,可以只 O(n) 更新 t(i)
对于求值,可以 O(n) 求出 g,然后套公式就好了
预处理出逆元
时间复杂度 O(n)
参考资料
如何直观地理解拉格朗日插值法?
拉格朗日插值学习小结
拉格朗日插值学习总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话