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


    拉格朗日插值入门
    由小学知识可知,n个点(x_i,y_i)可以唯一地确定一个多项式
    现在,给定n个点,请你确定这个多项式,并将k代入求值
    求出的值对998244353取模
    Input
    第一行两个正整数n,k,含义如题
    接下来n行,每行两个正整数x_i,y_i含义如题。n≤2000,xi,yi,k≤998244353
    Output
    一个整数表示答案
    Sample Input
    3 100
    1 4
    2 9
    3 16
    Sample Output
    10201
    //样例一中的三个点确定的多项式是f(x)=x^2+2x+1,将100代入求值得到10201

    //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<bits/stdc++.h>
    #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 ",ans);
    return 0;
    }

    #include<bits/stdc++.h>
    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 ",1ll*b*powmod(a,mod-2)%mod);
    //因为带了除法,所以分母会比较大,于是在前面边乘边取模,最后取逆元
    return 0;
    }

      

    zz:https://blog.csdn.net/shenwansangz/article/details/88682785

    参考资料

    //https://www.cnblogs.com/zwfymqz/p/10063039.html#_label1_0
    //https://blog.csdn.net/GodJing007/article/details/90957805

  • 相关阅读:
    生物创新科技素养大赛小车代码
    对拍程序
    Link-Cut-Tree学习笔记
    可平面性判定,任意平面图判定(代码实现)
    强联通缩点拓扑排序去重边小技巧
    20200405~06题解
    数论总结
    20200328题解
    Dp优化总结
    20200314题解
  • 原文地址:https://www.cnblogs.com/cutemush/p/12045754.html
Copyright © 2020-2023  润新知