拉格朗日差值学习笔记&做题记录

好像是多项式最基础的算法(?,但是咕了比较久,现在学一下吧。

差值是啥

这个东西类似于 FFT 的转化过程,就是多项式点值和多项式系数的转化,简而言之就是解决下面的问题,P4781

已知一个 n1 次多项式的 n 个点值,f(xi)=yi,已知 k,求 f(k)mod998244353

n2000

咋做

显然可以直接列方程然后高斯消元,复杂度 O(n3),非常寻宝。

考虑一个构造,令 F(x)=fi(x)yifi(xi),其中 fi(x) 是一个和 xi 有关的多项式,满足 fi(xi)0,fi(xj)=0(ji),这样就可以满足 F(xi)=yi 了,因为其他项全都是 0

再考虑怎么去构造这个 fi(x)

因为显然 xi 互不相同,所以可以构造出:

fi(x)=ji(xxj)

最后整理一下,可以得到:

F(k)=i=1nyiji(kxj)ji(xixj)

直接计算,时间复杂度 O(n2)

code


  • 点值连续差值

上面部分相当于一个前缀乘上一个后缀可以直接预处理,下面部分相当于每次一个阶乘乘上一些 1,可以列出:

F(k)=i=1nyiji(kxj)(i1)!(ni)!(1)ni

时间复杂度 O(n)


  • 求系数

上面的做法可以查询出一个值,但是这个多项式具体是啥呢。

其实也很简单,考虑主要麻烦的是 ji(kxj),可以先算 (kxi) 然后再去除就好了。


做题记录

CF622F *2600

已知 n,k,求 i=1nik

n109,k106

比较板子的题。

考虑设 f(x)=i=1xik,最后要求的就是 f(n)

考虑 f(x) 的次数是多少,考虑差分一下,f(x)f(x1)=xk,这是个 k 次项式子,那么根据多项式基本知识,前缀和次数加一,所以原式是 k+1 次多项式。

所以直接差值,然后用点值连续的做就好了。

code


P5667

已知 n,m,以及 f(0),f(1)f(n),求 f(m),f(m+1)f(m+n)

n160000,n<m108

求连续点值可以做到 O(n2),寄。

发现要求的点值连续,考虑直接推式,此处为了方便先把 n 加一。

f(k)=i=1nyik!(kn)!(ki+1)(i1)!(ni)!(1)ni

这个式子和上面的本质相同。

f(k)=k!(kn)!i=1nyi(ki+1)(i1)!(ni)!(1)ni=k!(kn)!i=1nyi(i1)!(ni)!(1)ni1ki+1

直接卷积即可。

code


posted @   houzhiyuan  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩