拉格朗日插值学习笔记

1|0拉格朗日插值

第一步:子函数 fi(x)={1x=xi0x=xj(ij)

由此可得:f(x)=i=1nyifi(x)

第二步:对于 fi(x),要满足当x=xi时,y=1,而xxi时,y=0故:

fi(x)=j=1,jin(xxj)j=1,jin(xixj)

这就是拉格朗日基本多项式(插值基函数)

因此多项式第i项为 yi×j=1,jin(xxj)j=1,jin(xixj)

所以又可以把多项式写为:

f(x)=i=1nyi×j=1,jin(xxj)j=1,jin(xixj)

展开后为:f(x)=y1(xx2)(xx3)(xxn)(x1x2)(x1x3)(x1xn)+y2(xx1)(xx3)(xxn)(x2x1)(x2x3)(x2xn)+yn(xx1)(xx2)(xxn1)(xnx1)(xnx1)(xnxn1)

我们可以发现,当x=xi时,除了第i项,其余项的分子中都有一项为(xxi),故其余项都为0,而对于第i项,分子中的(xxj)(ji)与分母中的(xixj)(ji)消掉了,最终只剩下了分子中的yi,因此就证明了f(x)就是满足f(xi)=yi的多项式。

1|11.P3643 [APIO2016] 划艇

题意:有n个位置,每个位置上可以选一个在[li,ri]中间的数,并且要大于它前面任意一个选了的数,也可以不选,求方案数。

思路:先考虑朴素DP。设f[i][j]表示第i个位置选了j的方案数,那么

f[i][j]=f[i1][j]+k=1j1f[i1][k]

我们发现如果把第二维j看作自变量的话,那么可以发现这是一个多项式,而每求一次前缀和次数+1,所以最高是n次多项式,那么我们带入n+1个点值进去就可以得到答案。

复杂度O(n3)

1|22.P8290 [省选联考 2022] 填树

题意:给一棵树,每个点的点权要么是 0,要么是 [lx,rx] 中的数,你要选择一条链,让这条链上的点权不为 0,求所有可能的满足非 0 极差不超过 k 的方案数和权值和。

思路:首先考虑朴素的暴力。我们枚举所有点权所在的区间 [l,l+k],然后计算答案,因为要取到下界,就要容斥掉 [l+1,l+k] 的答案。求答案的过程可以用树形 DP,每个点能选的是一个区间,那么可以算出当前点为链头和为 LCA 的答案,于是就可以做到 O(nV)

考虑优化。我们发现对于选择的区间 [l,l+k],每个点能取的范围是一个一次函数,那么总的贡献就是由这些一次函数形成的次数为 n 的多项式,这就不难想到用拉格朗日插值,代入 n+2 个点值就可以求出答案。对于求权值和,每个点能选的权值和是一个二次函数,那么总共就是 2n+1 次多项式,也可以同样处理。

复杂度 O(n3)

1|33.P7116 [NOIP2020] 微信步数

题意:在 k 维长方体中你规划了一个行进路线,循环往复,直到走出这 k 维长方体,才算走完。问以这 k 维长方体中的每一个位置为起点,你是否都能走完,如果能,输出你走的步数之和。

思路:先考虑能否走完。显然,每一维是独立的,如果有一维可以走完那么就会结束。如果在一轮中会走出去或者走完一轮后不在起点就会走完。

从这入手,可以把走路改成把边界往内缩,这样就可以有一个 O(nmT) 的做法,可以拿到 45 分。

因此,假设在第 T 轮结束,那么后 T1 轮都是一样的,只有第一轮不一样。

对于一轮,假设第一轮后还活着 aj 个位置,每轮会去掉 bj 个位置,最后一轮的 i 步去掉 fi=rili 个位置,那么在第 x+2 轮的第 i 步时,还活着 ajxbjfi 个点,贡献是 (ajxbjfi)

于是总贡献就是 i=1nx=0Tj=1m(ajxbjfi),内层就是一个关于 xm 次多项式,可以 O(m2) 暴力求。那么现在的问题就是求 x=0Txk,可以直接拉格朗日插值,于是就做完了。

复杂度 O(nm2)

1|44.[ARC118F] Growth Rate

题意:给定一个整数 M 和一个序列 {AN},计数值域为 [1,M] 的序列个数 {XN+1} 满足 i[1,N]AiXiXi+1,答案对 998244353 取模。

思路:插值好题。

首先有暴力 DP。设 f[i][j]$ 表示 xi=j 的方案数,那么转移是 f[i][j]kjaif[i+1][k]

然后可以发现,对于每个 i,有值的位置不多。具体地,记 limi 表示 f[i] 有值的位数,那么有 limn+1=M,lim[i]=limi+1ai

这样还是过不去。因为 j 这一维和值域相关,而且转移很简单,我们猜测 f[i][j] 是关于 j 的多项式。

g[i][j]=f[i][j],那么有 f[i][j]=g[i+1][limi+1]g[i+1][jai1](jlimi),可以证明 f[i][j] 是关于 jni+1 次多项式,g[i][j] 是关于 jni+2 次多项式。

因为我们维护的插值是连续的,可以线性计算,那么我们不需要维护系数,可以直接维护点值,然后每次转移时再求我们要的点值,这样复杂度是 O(n3) 的多项式。

又因为 ai=Mai 中不为 1 的项只有 O(logM) 个,而我们只有在 ai1 的时候才需要插值,ai=1 的时候 jai1 的值是可以直接查表的,因此复杂度就是 O(n2logM)

2|0一些特殊问题在模小质数高次幂下的做法

loj#6894. 自然 为例。

我们发现,因为模数是 264,因此答案在 n 比较大的时候应该是一个关于 n 的次数不高的多项式,于是可以考虑插值,次数可以设为 300 次。至于求逆元,把 2 提出来处理就可以了。

代码可以看 我的提交记录


__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/18013564.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示