一、引入
我们会遇到这样的问题:
给定
n
个点
(xi,yi)
,求一个
n−1
次多项式函数
f(x)
,
使对于每个
i
,都有
f(xi)=yi
。
其中
xi
互不相同。
利用线性代数的知识可以得出有且仅有一个
f(x)
满足条件。
二、结论
下面直接给出结论:
f(x)=∑i=0n−1yi∏j=0,j≠in−1x−xjxi−xj
复杂度
O(n2)
。
三、证明
对于任意
0≤k<n
,将
xk
代入公式:
对于
i=k
,有
xi=xk
:
yk∏j=0,j≠kn−1xk−xjxk−xj=yk
而对于
i≠k
,在满足
0≤j<n,j≠i
的
j
中一定有一个
j=k
。
于是就必定有一个
xk−xk
的项。
所以对于
i≠k
:
yi∏j=0,j≠in−1xk−xjxi−xj=0
得证。
四、应用
如果知道了两个变量之间的联系是多项式并知道了多项式的次数
n−1
,那么可以取
n
个值(要取合适的值)代入多项式并求解。
如:
给定
n,k
,求:
∑i=1nik
n≤1018,k≤106
。
我们知道:
∑i=1ni0=n
∑i=1ni1=n(n+1)2
∑i=1ni2=n(n+1)(2n+1)6
∑i=1ni3=(n(n+1)2)2
得出结论:
f(n,k)=∑ni=1ik
是一个
k+1
次多项式。
可以取
k+2
个值
1,2,...,k+2
并计算出
f(1,k),f(2,k),...,f(k+2,k)
代入:
f(n,k)=∑i=1k+2f(i,k)∏j=1,j≠ik+2n−ji−j
可以
O(k)
预处理出
g(i)=∏k+2j=1,j≠i{n−j}
。对
j<i
和
j>i
分别处理即可。
而对
∏k+2j=1,j≠i{i−j}
,也可以分
j<i
和
j>i
分别处理:
∏j=1,j≠ik+2{i−j}=(−1)k+2−i(i−1)!(k+2−i)!
预处理阶乘后,复杂度就是
O(k)
的。然而由于求
f(i,k)
时要求幂,复杂度
O(klogk)
。