拉格朗日插值小记

对于 n 个点 (xi,yi)xi 互不相同,则我们可以 唯一 确定一个 n1 次多项式经过这 n 点。

1. 拉格朗日插值

拉格朗日插值的核心思想是每次只考虑一个点值,将其他点值都视作 0,即对于每一个点 (xi,yi),我们构造一个函数 fi(x)

  • 当且仅当 x=xifi(x)=yi,当 x=xj(ji) 时,fi(x)=0

这样我们可以构造出经过所有点的函数 f(x)=fi(x)

则我们首先对于每个点 (xi,yi),设 fi(x)=ji(xxj),则显然可以满足上述条件,而我们又要满足 f(xi)=yi,则我们可以构造:

f(x)=i=1nyiijxxjxixj

这样我们可以轻松的用 O(n2) 的复杂度解决。

P4781 【模板】拉格朗日插值

直接套式子即可,逆元可以乘完再逆,写的时候脑子宕机了。

int main(){
	n = read(),k = read();
	for(int i = 1;i <= n;i++)x[i] = read(),y[i] = read();
	ll ans = 0;
	for(int i = 1;i <= n;i++){
		ll s = y[i] % mod;
		for(int j = 1;j <= n;j++){
			if(i == j)continue;
			s = s * (k - x[j] + mod) % mod;
			s = s * ksm((x[i] - x[j] + mod) % mod,mod - 2) % mod;
		}
		(ans += s) %= mod;
	}
	printf("%lld\n",ans);

	return 0;

}

2. 一些小优化

当这些点值是 (i,yi) 时,则我们可以分开处理 ijxjijij

前者我们可以首先算出 xj,求的时候除个 (xi) 即可。

后者我们可以分成 j<ij>i 两个部分,求出答案是 (i1)!×(ni)!(1)ni

预处理逆元,复杂度 O(nlogV)

例题: CF622F The Sum of the k-th Powers

即求 i=1nik

n 太大,我们考虑关于 k 的复杂度。

首先我们可以知道这是一个关于 nk+1 次多项式,我们只需要暴力求出前 k+2,即可拉插,复杂度 O(nlogV)

  • 如何证明是一个 k+1 次多项式呢?

    我们可以归纳证明: 首先懒得奠基。

    假设该结论对所有 k<m 都成立,则现在证明 k=m 时成立。

    首先有 (i+1)m+1im+1=j=0m(m+1j)ij

    我们对所有的 i 求和,左边是个裂项,答案为 (n+1)m+11

    (n+1)m+11=i=1nj=0m(m+1j)ij=j=0m(m+1j)i=1nij

    把右边 j=m 移项得 i=1nim=(n+1)m+11j=0m1(m+1j)i=1nij

    左半部分次数为 m+1,右半部分最大次数为 m1+1=m,证毕。

3. 多项式快速插值

不会

4. 例题

I CF622F The Sum of the k-th Powers

上述。
代码

II P4463 [集训队互测 2012] calc

首先我们考虑 DP,不妨设 ai<ai+1,这样我们最后乘个 n! 即可。

fi,j 表示值域为 [1,i] 且序列长度为 j 时的答案。

则有转移方程 fi,j=fi1,j+fi1,j1×i,直接写复杂度是 O(kn) 的,无法通过。

我们可以发现 fi,j 可以视为 一个关于 i 的比较小次数的多项式,我们考虑分析一下其次数。

  • 由转移方程得,fi,jfi1,j=fi1,j1×i

    首先有对于一个 k 次多项式 f(x),则 f(x+1)f(x) 是一个 k1 次多项式,可以二次项定理拆开简单证明。

    fi,j 的次数 1 等于 fi,j1 的次数 +1,又有 fi,0 是一个 0 次多项式,可得 fi,j 是一个关于 i2j 次多项式。

则我们求出前 2n+1 个 DP 值,拉插一下即可。

复杂度 O(n2)

代码

III BZOJ3453: tyvj 1858 XLkxc

题意,给定 k,n,d,ak123n,d,a123456789,求 i=0nj=1a+idp=1jpk

首先 f(x)=i=1xik 是一个 k+1 多项式,则 g(x)=i=1xfi 是一个 k+2 次多项式,都可以 拉插 求出。

最后答案即为 i=0ng(a+id),答案最多是一个关于 nk+3 次多项式,也可以 拉插,可以求出前 k+4 项,其中 g(x) 在内部也可以拉插求,总复杂度 O(k3),利用 2. 的技巧可以优化到 O(k2)

没有代码。

参考文章

只是 Lagrange 插值 - Hagasei-Chan

posted @   oXUo  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
网站统计
点击右上角即可分享
微信分享提示