问题描述
题解
多项式点值转系数的方法。
时间复杂度 \(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;
}