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

♀尐吖头ヾ 提交于 2019-12-15 20:40:44

拉格朗日插值入门
由小学知识可知,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

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

  

 

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!