LG4781 「模板」拉格朗日插值 拉格朗日插值

问题描述

LG4781


题解

多项式点值转系数的方法。

时间复杂度 \(O(n^2)\),要线性求逆。

\(n+1\) 次多项式的拉格朗日插值式子:

\[F(k)=\sum\limits_{i=0}^{n}{y_i \times \prod\limits_{i \neq j}{\frac{k-x_j}{x_i-x_j}}}\]


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

const int mod=998244353;
const int maxn=2007;

#define int long long

int n,k;
int X[maxn],Y[maxn];
int F[maxn];

long long ksm(long long x,int p){
    long long res(1);
//  x=((x%mod)+mod)%mod;
    while(p){
        if(p&1) res=res*x%mod;p>>=1;
        x=x*x%mod;
    }
    return res;
}

void Init(void){
    scanf("%lld%lld",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%lld%lld",&X[i],&Y[i]);
    }
}

void Work(void){
    long long res(0);
    for(int i=0;i<n;i++){
        long long cnt(1);
        for(int j=0;j<n;j++) if(i!=j) cnt=cnt*((X[i]+mod-X[j])%mod)%mod;
        cnt=ksm(cnt,mod-2);
        for(int j=0;j<n;j++) if(i!=j) cnt=cnt*((k-X[j]+mod)%mod)%mod;
        cnt=cnt*Y[i]%mod;
        res=(res+cnt)%mod;
    }
    printf("%lld\n",res);
}

signed main(){
    Init();
    Work();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/liubainian/p/12113232.html