拉格朗日插值法
概述
-
拉格朗日插值法(下简称拉插)是一种多项式单点求值的算法。
-
对于任意的
次多项式,我们可以利用其已知的 个或更多的点唯一确定该多项式的形式,且拥有比高消更为优秀的复杂度。
实现原理
-
在已知
次多项式 的 个点后,我们可以利用 Gauss 消元来 地求出其各项系数,查询复杂度则是 。注意到明显的不平衡,设法设计一种方式能 之类地同时支持构建和查询。 -
不妨记已知点为
,考虑构建这么一个多项式: ,使得 。 -
可以证明该函数符合已知的
个点,于是其唯一确定,从而该函数即为原函数。 -
考虑
,可以这么配 : 。目的在于使得 时,分子分母全部互相消去, 时,有一项分子为 的效果。 -
综合得
,可以在 的时间内求值,并且可以在模意义下进行。 -
一个小 tip:把一个
次多项式认为成 次多项式是合法的,因为这相当于高次项系数赋成 。在不是很确定到底是多少次的时候,强烈建议 ,以防由于前缀和/差分/...带来的升次而挂掉。
连续性拉插优化
-
在我们自行构造的多项式中,可以考虑将
取连续的 。此时会有非常美妙的性质: -
原式可以化为
。 -
对于分子,可以
求前缀积与后缀积; -
对于分母,显而易见它是一个类阶乘
。进一步地,其逆元是可以预处理的。 -
所以能把
优化到 ,比较常见的用法是在确保是多项式的 dp 中加速求解,如 。 -
下面给出优化版本的封装函数式代码,其中
为多项式次数, 为所求点。
il ll lagrange(ll K,ll k){
static ll prof[maxk],prob[maxk],numer,denom,ret;//prod
prof[0]=prob[K+2]=1,ret=0;
for(ll i=1;i<=K+1;++i) prof[i]=prof[i-1]*(k-i)%mod;
for(ll i=K+1;i;--i) prob[i]=prob[i+1]*(k-i)%mod;
For(i,1,K+1){
numer=prof[i-1]*prob[i+1]%mod; if(numer<0) numer+=mod;
denom=finv[i-1]*finv[K+1-i]%mod;
if((K+1-i)&1 && denom) denom=mod-denom;//需要考虑 denom=0 的情况
ret=(ret+v[i]*numer%mod*denom)%mod;
}
return ret;
}
例题
P5469 [NOI2019] 机器人
23.1.12 T1 实用和
- 版权原因,请移步查看。同校的可以找我要截图。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】