【学习小结】拉格朗日插值

什么是拉格朗日插值

给出N+ 1个点值求解一个n次多项式的系数

当然,其实我们不一定关心系数,插值是用较小的(好求)的点值求较大的难求的点值,所以只需要O(n)求值就行了

**于是我们就有了重心插值公式: g ( x ) = l ( x ) ∑ i = 1 n ω i ( x − x i ) g(x)=l(x)\sum_{i=1}^{n}\frac{\omega _i}{(x-x_i)} g(x)=l(x)i=1n(xxi)ωi , 其中 ω i = y i ∏ j ̸ = i ( x i − x j ) \omega_i= \frac{y_i}{\prod\limits_{j\not = i}(x_i-x_j)} ωi=j̸=i(xixj)yi **

只需将两部分分开维护,每次加入一个点暴力更新l(x)和wi,而查询的时候分别算点值再乘起来
若x是已求的值,则需要直接返回点值,不能代入多项式计算

关于插值的推导

插值的优化

如果我们代入的点xi是连续的,可以用最原始的公式O(n)求出一个大点的点值
详见这里

当然,可以用多项式技巧快速插值 虽然是O(nlog3n)
详见这里

插值法的用途

有很多递推式,n很大(比如1e9),但是其实是关于n的k次多项式(k一般是1000左右),于是代入很小的n计算出多项式,再插值出答案。有些题目的复杂度瓶颈在于求点值,一般是k^2的,而插值可以用取值点连续优化到O(k)

下面是例题

bzoj 3453: tyvj 1858 XLkxc
my code
维护多个不同多项式还是应该写成struct

关于幂和是k+1次多项式,前面加两个求和符号,变成k+3次,分别插值,先求g(n),在求答案,复杂度O(k^2)

而且得出了两个结论:
1.每个求和号一般会增加多项式次数1.
2.插值可以嵌套。
特别是第二点,基本上可以在O(k2)解决所有跟多项式有关的题。

bzoj 2655
my code

显然是关于A的多项式,至于次数,是2 * n。考虑我们代入A < n答案是0,所以可以猜2 * n嘛

再感性理解一下,n个变量取值与A有关,应该是多项式次数O(n)级别的

然后对于小的值,直接暴力dp就好了,F[i][j]表示考虑到大小为i的数,选了j个。不用容斥,想麻烦了

bzoj4559 成绩比较
my code

这道题把每个科目分开考虑,分开插值求方案数。

然后用dp来考虑K个被碾压的限制,如果容斥的话(枚举至少k人被碾压)需要把每个科目重新插值,没有必要,也会T

我们再来看幂和

这是模板题
拉格朗日插值给出了另一种O(klogk)的做法
my code

用快速幂求n=0,1,…,k的幂和,再暴力插值。这里正如前面提到的,因为代入x连续,求点值是O(k)的。化成阶乘就好

我们也可以用第二类斯特林数求幂和

S ( n ) = ∑ j = 0 k   ∗ S ( k , j ) ∗ j ! ∗ C ( n + 1 , j + 1 ) S(n) = \sum_{j=0}^k\ * S(k,j) * j! * C(n +1,j +1) S(n)=j=0k S(k,j)j!C(n+1,j+1)

你可能感兴趣的:(知识点总结,计数,数学,多项式,多项式,生成函数)