拉格朗日插值

其实很简单。

考虑一个 k 次多项式,需要 k+1x 值不同的点来确定。那现在要求构造一个函数 f(x) 过点 P1(x1,y1),P2(x2,y2),,Pn(xn,yn)。我们设第 i 个点在 x 轴的投影是 Pi(xi,0)

考虑构造 n 个函数 gi(x),使得对于函数 gi(x),过 Pj(xj,yj),jiPi(xi,yi)。即只在 (xi1,xi+1) 区间有实际值。

那么可知,f(x)=i=1ngi(x)。既然让 ji 都没值,那就设 gi(x)=aji(xxj),其中 a 是修正量,因为要满足 gi(xi)=yi

带入 Pi(xi,yi) 可得:

a=yiji(xixj)

带回 gi(x) 可得:

gi(x)=yi×jixxjxixj

带回 f(x) 可得:

f(x)=i=1n(yi×jixxjxixj)

然后这就是拉格朗日插值的形式。整体算的时间复杂度是 O(n2)

模板代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e3+3,mod=998244353;
int ppow(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res=(res*a)%mod;
a=(a*a)%mod,b>>=1;
}return res;
}
int n,k;
int x[N],y[N];
signed main()
{
cin>>n>>k;
int ans=0;
for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
for(int i=1;i<=n;i++)
{
int res1=1,res2=1;
for(int j=1;j<=n;j++)
{
if(i==j) continue;
res1=(res1*(k-x[j]+mod)%mod)%mod;
res2=(res2*(x[i]-x[j]+mod)%mod)%mod;
}
ans=(ans+y[i]*res1%mod*ppow(res2,mod-2)%mod)%mod;
}
cout<<ans;
}

然后有一个比较神秘的问题,是说 i=1nik 是一个 k+1 次多项式。

试着证明一下:

若它是一个 k+1 次多项式,那么它一定和另一个 k+1 次多项式有对等关系。我们将 i=1nik 记为 S(n,k)

考虑将两个 k+1 次多项式 (n+1)k+1nk+1 相减,可以得出:

(n+1)k+1nk+1=i=0k+1(k+1i)nink+1=i=0k(k+1i)ni(1)

然后,将 nk+1(n1)k+1 相减,可以得出:

nk+1(n1)k+1=i=0k+1(k+1i)(n1)i(n1)k+1=i=0k(k+1i)(n1)i(2)

以此类推,到最后,令 1k+10k+1 相减,是 i=0k0i(n+1)

这样,我们就有了 n+1 个式子,考虑将他们加起来,根据裂项相消法,i=1n+1(i)=(n+1)k+1

另一侧:

(n+1)k+1=i=0k+1(k+1i)ni+i=0k+1(k+1i)(n1)i++i=0k0i=i=0k+1(k+1i)j=0nji=i=0k+1(k+1i)S(n,i)

由此,不难得到 S(n,i)(n+1)k+1 的关系,也就证明了这个结论。

posted @   ccjjxx  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示