rstudio拉格朗日插值法_拉格朗日插值法(图文详解)

//https://www.cnblogs.com/zwfymqz/p/10063039.html#_label1_0

//https://blog.csdn.net/GodJing007/article/details/90957805

//https://riteme.site/blog/2017-3-18/lagrange-interpolation.html

#include

#define int long long

using namespace std;

const int N=2e3+1;

const int mod=998244353;

int n,k,ans,a[N],b[N];

int quickpow(int x,int y)

int re=1;

while(y){

if(y&1) re=(x*re)%mod;

x=(x*x)%mod;y>>=1;

}return re;

}

int read(){

int x=0,f=1;char ch=getchar();

while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}

while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}

return x*f;

}

signed main(){

n=read(),k=read();

for(int i=1;i<=n;i++)

a[i]=read(),b[i]=read();

for(int i=1;i<=n;i++)

{

int tmp=1;

for(int j=1;j<=n;j++)

if(i!=j)

tmp=tmp*(a[i]+mod-a[j])%mod; //分母

tmp=quickpow(tmp,mod-2);

for(int j=1;j<=n;j++)

if(i!=j) tmp=tmp*(k+mod-a[j])%mod; //分子

tmp=tmp*b[i]%mod;

ans=(ans+tmp)%mod;

}printf("%lld\n",ans);

return 0;

}

#include

using namespace std;

const int mod=998244353;

int x[2010],y[2010],a=1,b=0;

int powmod(int a,int b)

{

int ans=1;

while(b)

{

if(b&1)ans=1ll*ans*a%mod;

a=1ll*a*a%mod;

b>>=1;

}

return ans;

}

int main()

{

int n,k;

scanf("%d%d",&n,&k);

for(int i=1;i<=n;i++)

scanf("%d%d",x+i,y+i);

for(int i=1;i<=n;i++)

{

int a1=1,b1=1;//a1代表分母,b1代表分子

b1=1ll*b1*y[i]%mod;

for(int j=1;j<=n;j++)

if(j!=i)

{

b1=1ll*b1*(k-x[j])%mod;

a1=1ll*a1*(x[i]-x[j])%mod;

}

b=(1ll*a1*b+1ll*a*b1)%mod;

a=1ll*a*a1%mod;

//b/a+b1/a1=(b*a1+a*b1)/(a*a1)

}

a=(a+mod)%mod,b=(b+mod)%mod;

printf("%lld\n",1ll*b*powmod(a,mod-2)%mod);

//因为带了除法,所以分母会比较大,于是在前面边乘边取模,最后取逆元

return 0;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值