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;
}
posted @ 2019-12-28 22:02  览遍千秋  阅读(147)  评论(0编辑  收藏  举报