「学习笔记」Lagrange插值

Lagrange 插值

Lagrange 公式:

f(x)=i=1nyiijxxjxixj

如果给定了点值直接逆做就行了

貌似和 IDFT 有类似的地方,但是也显然是不一样的(点值的位置是不同的,FFT 利用了单位根的性质)

好像可以快速插值然后单点求值

时间复杂度 O(n2)

前后缀优化 Lagrange 插值

如果点值连续,可以预处理要求的 f(k)ki

那么求一个 kxixixj 就可以阶乘逆元做了

这个是最常见的做法,貌似下面的例题均用此做法来进行了时间复杂度的优化

重心 Lagrange 插值

推一下式子考虑增量即可

应用是自然数幂前缀和,因为伯努利数原理,那么用第二个插值方法就行了

例题

「JLOI2016」 成绩比较

先钦定哪些人比他高,最后给答案乘 (n1k)

考虑名次的限制,这里会计漏或者重复,那么容斥,也就是

i=0nk(1)nki(nki)k=1m(iRi)

最后是分数的部分,列式展开发现需要对自然数求幂和,插值即可

i=1mx=1Ui(Ux)Ri1xnRi

「集训队互测2012」calc

朴素的 dptrivial 的:fi,j=fi1,j1×j+fi1,j

假设 fi,jg(i) 次多项式,正向可以证明 g(i)=2i

所以求出来一些点值之后插 k 处的就行了

也可以使用生成函数科技:

考虑答案显然为 i=1k(1+ix)

按照套路,乘法取 ln 转加法

得到的式子为:

exp(i=1(1)i+1iki!xi)

换换顺序得到 Tyler 展开的式子,同时还可以等比数列求和,那么需要几次 exp 就好了

「Codeforces 995F」Cowmpany Cowmpensation

树上的上面一题,值得指出的是,这个多项式是 n 次的

貌似没有生成函数做法

「NOI2019」机器人

本题并不属于简单题

考虑一个非常 trivialdp:设 fi,j,k 表示 [i,j] 的最大值为 k 的时候的答案,那么答案为 f1,n,mx

转移考虑找区间里面满足 |(xi)(xj)|2x

其实不难观察得到 x{mid,mid+1,mid1}(分区间长度讨论即可)

所以发现这个 fl,r 的状态大概在 knlogn 左右,跑一个记忆化搜索发现是 20003000

因为是插值找的这题目,所以考虑 fl,r,k 会不会是关于 k 的多项式,按套路,可能是 rl+2 次的

考虑对于 l=r ,不为 0k 是常数,那么按照原来 dp 式子的转移做两边乘法,所以次数增加

(以上证明显然并不严谨,具体证明留坑待填)

所以考虑按照值域分段来进行 dp 的转移,对于当前值域 [v[i],v[i+1]1] 可以仅取区间长度个点值来转移,然后就可以插出来 dpl,r,v[i+1]1

以上思考是 trivial 的,具体实现的时候,dp 暴力进行即可,使用记忆化搜索,每次清空 n+2

以上做法是相对好写(好猜)但是速度非常之慢,本地跑极限数据要 6s 左右(但是交上去卡了好久过了),根据赛时反馈也确实只能拿 95 分

貌似 mayaohua2003 的游记里面提到了一个下降幂的做法,因为我完全不熟悉下降幂的科技,所以等学习了之后再补

不可否认,这目前是(估计也将会是)这篇博客里面最高明的题目

posted @   没学完四大礼包不改名  阅读(337)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示