luogu P4781 【模板】拉格朗日插值
题面传送门
拉格朗日插值就是指:给出某个多项式的点值表示法,求这个多项式在取某一个值时的取值。
\(f(k)=\sum\limits_{i=1}^{n}{y_i\prod\limits_{j≠i}{\frac{k-x_j}{x_i-x_j}}}\)
感性理解一下,发现把\(n\)个给定点带进去是对的。一个很巧妙的构造。
然后这道题还要求逆元。我们可以先把累乘的分子分母分别算出来,然后最后再算逆元即可。复杂度少一个log。是\(O(n^2)\)
code:
#include<cstdio>
#define p 998244353
#define ll long long
using namespace std;
int n,m,k,z;
ll a[2039],b[2039],ans,x,y;
inline ll mpow(ll x,int y){
ll ans=1;
while(y){
if(y&1) ans=ans*x%p;
y>>=1;x=x*x%p;
}
return ans;
}
int main(){
register int i,j;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]);
for(i=1;i<=n;i++){
for(x=y=1,j=1;j<=n;j++){
if(i==j) continue;
x=x*(k-a[j]+p)%p;y=y*(a[i]-a[j]+p)%p;
}
x=x*mpow(y,p-2)%p;
ans=(ans+x*b[i])%p;
}
printf("%lld\n",ans);
}