[浅谈] 拉格朗日插值
Introduce
给定
Principle
我们考虑构造函数
然后再构造
给定
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e3+110,mod=998244353;
int read(){
int x=0,f=1;char c=getchar();
while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n,k,x[N],y[N],ans;
int ksm(int x,int y){
int sum=1;
while(y){
if(y&1)sum=(sum*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return sum%mod;
}
signed main(){
n=read(),k=read();
for(int i=1;i<=n;i++)x[i]=read(),y[i]=read();
for(int i=1;i<=n;i++){
int tmp=y[i];
for(int j=1;j<=n;j++)if(j!=i)tmp=tmp%mod*(k-x[j])%mod*ksm(x[i]-x[j],mod-2)%mod;
ans=(ans+tmp)%mod;
}
printf("%lld\n",(ans+mod)%mod);
return 0;
}
连续时优化
如果
此时
时间复杂度
可能有锅
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+110,mod=998244353;
int read(){
int x=0,f=1;char c=getchar();
while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n,k,fac[N],pre[N],suf[N],y[N],ans;
int ksm(int x,int y){
int sum=1;
while(y){
if(y&1)sum=(sum*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return sum%mod;
}
void pre_opt(){
fac[0]=pre[0]=suf[n+1]=1;
for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i%mod;
for(int i=1;i<=n;i++)pre[i]=(pre[i-1]*(k-i))%mod;//,cout<<pre[i]<<" ";cout<<endl;
for(int i=n;i>=1;i--)suf[i]=(suf[i+1]*(k-i))%mod;//,cout<<suf[i]<<" ";cout<<endl;
return;
}
signed main(){
n=read(),k=read()%mod;
for(int i=1;i<=n;i++)y[i]=read()%mod;
pre_opt();
for(int i=1;i<=n;i++){
int tmp=y[i];
tmp=tmp*pre[i-1]%mod*suf[i+1]%mod;
tmp=tmp*ksm(fac[i-1]*fac[n-i]%mod*ksm(-1,n-i)%mod,mod-2)%mod;
ans=(ans+tmp)%mod;
}
printf("%lld\n",(ans+mod)%mod);
return 0;
}
求
把这个式子展开其实是个
最后提醒一句:分数取模不要漏模,多模,减法时注意
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+110,mod=1e9+7;
int read(){
int x=0,f=1;char c=getchar();
while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int n,k,fac[N],pre[N],suf[N],y,ans;
int ksm(int x,int y){
int sum=1;
while(y){
if(y&1)sum=(sum*x)%mod;
y>>=1;
x=(x*x)%mod;
}
return sum%mod;
}
void pre_opt(){
fac[0]=pre[0]=suf[k+3]=1;
for(int i=1;i<=k+2;i++)fac[i]=fac[i-1]*i%mod;
for(int i=1;i<=k+2;i++)pre[i]=(pre[i-1]*(n-i))%mod;//,cout<<pre[i]<<" ";cout<<endl;
for(int i=k+2;i>=1;i--)suf[i]=(suf[i+1]*(n-i))%mod;//,cout<<suf[i]<<" ";cout<<endl;
return;
}
signed main(){
n=read(),k=read();
pre_opt();
for(int i=1;i<=k+2;i++){
y=(y+ksm(i,k))%mod;int tmp=y;
int a=y*pre[i-1]%mod*suf[i+1]%mod;
int b=fac[i-1]*fac[m+3-i]%mod*ksm(-1,m+3-i)%mod;
ans=(ans+a*ksm(b,mod-2)%mod+mod)%mod;
}
printf("%lld\n",(ans+mod)%mod);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)