拉格朗日插值
感觉还是有必要学一下的。
插值
简单来讲,插值就是一个根据一些已有的坐标点求出一个近似函数的过程,从而得出其他的未知点。
有两种插值方式:一种是线性插值,用分段线性函数来进行函数拟合;另一种是多项式插值,拉格朗日插值法便是一种多项式插值,在OI中应该也就只用这种就行了。多项式插值的形式一般如下:
对已知的 \(n+1\) 个点 \((x_0,y_0),(x_1,y_1),\ldots,(x_n,y_n)\),求 \(n\) 阶多项式 \(f(x)\) 满足 \(f(x_i)=y_i,\forall i=0,1,\dots,n\)
学一个拉格朗日插值就行了。
拉格朗日插值
要求构造一个函数 \(f(x)\) 过点 \(P_1(x_1,y_1),P_2(x_2,y_2),\cdots,P_n(x_n,y_n)\)。首先设第 \(i\) 点在 \(x\) 轴上的投影为 \(P_i^{\prime}(x_i,0)\)。考虑构造 \(n\) 个函数 \(f_1(x), f_2(x), \cdots, f_n(x)\),使得对于第 \(i\) 个函数 \(f_i(x)\),其图像过 \(\begin{cases}P_j^{\prime}(x_j,0),(j\neq i)\\P_i(x_i,y_i)\end{cases}\),则可知题目所求的函数 \(f(x)=\sum\limits_{i=1}^nf_i(x)\)。
那么可以设 \(f_i(x)=a\cdot\prod_{j\neq i}(x-x_j)\),将点 \(P_i(x_i,y_i)\) 代入可以知道 \(a=\dfrac{y_i}{\prod_{j\neq i} (x_i-x_j)}\),所以 $$f_i(x)=y_i\cdot\dfrac{\prod_{j\neq i} (x-x_j)}{\prod_{j\neq i} (x_i-x_j)}=y_i\cdot\prod_{j\neq i}\dfrac{x-x_j}{x_i-x_j}$$
那么我们就可以得出拉格朗日插值的形式为:\(f(x)=\sum_{i=1}^ny_i\cdot\prod_{j\neq i}\dfrac{x-x_j}{x_i-x_j}\)
简单来讲就是找到一些多项式满足 \(f_i(x_i)=1,f_i(x_j)=0\:(j\neq i)\),然后把他们带权加起来。
这样朴素的拉格朗日插值是 \(O(n^2)\) 的,可以优化到 \(O(n\log^2 n)\),如果已知点的横坐标是连续整数,那么还可以做到 \(O(n)\) 插值。
例题
P4781 【模板】拉格朗日插值
没啥说的,就直接 \(O(n^2)\) 按式子求就行了。
CF622F
首先要知道所求的答案是一个 \(k+1\) 次的多项式,但是 \(k\) 的取值是 \(10^6\),\(O(n^2)\) 朴素做法无法通过。但这个题中我们已知的点是连续的整数,这样是可以优化的。
考虑原本的式子 \(\sum_{i=0}^n y_i\prod_{j\neq i}\dfrac{k-x_j}{x_i-xj}\) ,因为 \(x_i\)是 \(0\sim n\) 的连续整数,所以式子就是:\(\sum_{i=0}^n y_i\prod_{j\neq i}\dfrac{k-j}{i-j}\),发现分子为 \(\dfrac{\prod\limits^{n+1}_{j=1}(x-j)}{i-j}\),分母的 \(i-j\) 累乘可以拆成两段阶乘来算:\((-1)^{n+1-i}\times(i-1)!\:\times(n+1+i)!\)
于是横坐标为 \(1,\cdots,n+1\) 的插值公式就为:$$f(k)=\sum\limits_{i=1}^{n+1} (-1)^{n+1-i} y_i\cdot\dfrac{\prod_{j=1}^{n+1}(k-j)}{(i-1)!(n+1-i)!(k-i)}$$
然后用前缀后缀积维护就可以优化掉一层循环,时间复杂度 \(O(n)\)。

浙公网安备 33010602011771号