把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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);
}
posted @ 2021-02-16 14:31  275307894a  阅读(55)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end