【模板】拉格朗日插值
开始学习数学了……
众所周知拉格朗日插值可以解决如下问题:给定N个点,可以在
拉格朗日插值的思想是构造。用一句经典的话来说,假如我们有N个项数和次数都为N-1的函数
于是可以发现,假如有函数
那么显然这个函数的次数和项数都符合条件,而且某个
但是那个
那么这个函数
合起来就可以得到最终的结论:
然后发现可以直接带值进行计算。代码挺好写的,有几个地方需要注意一下:
- 除法部分确实需要用逆元,但为了少求几次可以考虑全部乘起来之后再一次性搞定。
- 关于取模,最后答案可能是负数,这就意味着必须要用馍加馍的方法把它强行搞成正数。连Wa三次得出的教训。
#include<cstdio>
#define zczc
#define int long long
const int mod=998244353;
const int N=2010;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w>='0'&&w<='9'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
int m,w,ans,x[N],y[N];
inline int pow(int s1,int s2){
if(s2==1)return s1;if(s2==0)return 1;
int an=pow(s1,s2>>1);
if(s2&1)return an*an%mod*s1%mod;
else return an*an%mod;
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);read(w);
for(int i=1;i<=m;i++){read(x[i]);read(y[i]);}
for(int i=1;i<=m;i++){
int a=y[i],b=1;
for(int j=1;j<=m;j++){
if(i==j)continue;
a*=w-x[j];a%=mod;
b*=x[i]-x[j];b%=mod;
}
ans+=a*pow(b,mod-2)%mod;ans%=mod;
}
printf("%lld",(ans+mod)%mod);
return 0;
}
一如既往,万事胜意
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具