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

问题描述

LG4781


题解

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

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

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

[F(k)=sumlimits_{i=0}^{n}{y_i imes prodlimits_{i eq 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
",res);
}

signed main(){
	Init();
	Work();
	return 0;
}
原文地址:https://www.cnblogs.com/liubainian/p/12113232.html