感觉我正在日益沦为一个搬运工...
线性插值是指这样一个问题:给定整数(n,m),以及一个(n)次多项式(f)在(0,1,2,dots,n-1)处的点值,即(f(0),f(1),f(2),dots,f(n-1)),希望能在关于(n)的线性时间内求出(f(m))。(nleq 10^6,mleq 10^{18})。
利用多项式多点插值并求一次点值可以做到(O(nlog^2n)),但显然是过不去的。
我们考虑多项式(f)的牛顿级数,设其为(c),即:
[sum_{i=0}^{n-1}f_ix^i=sum_{i=0}^{n-1}c_i{xchoose i}
]
那么对于(m=0,1,2,dots,n-1),显然有:
[f(m)=sum_{i=0}^{n-1}c_i{mchoose i}
]
注意到当(igeq m)时({mchoose i})为(0),于是修改求和上限:
[f(m)=sum_{i=0}^mc_i{mchoose i}
]
这就是经典的二项式反演的形式,于是我们就得到:
[c_i=sum_{j=0}^i(-1)^{i-j}{ichoose j}f(j)
]
进回带到求和上限为(n-1)的式中,于是有:
[f(m)=sum_{i=0}^{n-1}Bigg({mchoose i}sum_{j=0}^i(-1)^{i-j}{ichoose j}f(j)Bigg)
]
套路一波,将对(j)的求和放到外面:
[f(m)=sum_{j=0}^{n-1}Bigg(f(j)sum_{i=j}^{n-1}(-1)^{i-j}{mchoose i}{ichoose j}Bigg)
]
为了直观,我们用(i)替换(i-j):
[f(m)=sum_{j=0}^{n-1}Bigg(f(j)sum_{i=0}^{n-1-j}(-1)^i{mchoose i+j}{i+jchoose j}Bigg)
]
利用({mchoose i+j}{i+jchoose j}={mchoose j}{m-jchoose i})进行替换,得到:
[f(m)=sum_{j=0}^{n-1}Bigg(f(j)sum_{i=0}^{n-1-j}(-1)^i{mchoose j}{m-jchoose i}Bigg)
]
于是({mchoose j})可以放到前面:
[f(m)=sum_{j=0}^{n-1}Bigg(f(j){mchoose j}sum_{i=0}^{n-1-j}(-1)^i{m-jchoose i}Bigg)
]
现在考虑求出下面的式子的封闭形式:
[sum_{i=0}^{n-1}(-1)^i{mchoose i}
]
首先是应用上指标反转使((-1)^i{mchoose i}={i-m-1choose i}):
[sum_{i=0}^{n-1}{i-m-1choose i}
]
考虑加入一个数({-m-1choose -1}=0):
[{-m-1choose -1}+sum_{i=0}^{n-1}{i-m-1choose i}
]
裂项:
[{-m-1choose -1}+{-m-1choose 0}+sum_{i=1}^{n-1}{i-m-1choose i}
]
[{-mchoose 0}+sum_{i=1}^{n-1}{i-m-1choose i}
]
一直重复,直到只剩下:
[{n-m-1choose n-1}
]
再进行上指标反转:
[(-1)^{n-1}{m-1choose n-1}
]
于是原式终于可以简化为:
[f(m)=sum_{j=0}^{n-1}Bigg(f(j){mchoose j}(-1)^{n-1-j}{m-1-jchoose n-1-j}Bigg)
]
整理,得:
[f(m)=sum_{i=0}^{n-1}(-1)^{n-1-i}{mchoose i}{m-1-ichoose n-1-i}f(i)
]
用阶乘展开组合数:
[f(m)=sum_{i=0}^{n-1}(-1)^{n-1-i}frac{m!}{i!(m-i)!}frac{(m-1-i)!}{(n-1-i)!(m-n)!} f(i)
]
继续整理:
[f(m)=m^{underline n}sum_{i=0}^{n-1}frac{(-1)^{n-1-i}}{(m-i)i!(n-1-i)!}f(i)
]
于是就可以做了,(m-i)的逆元可以用与预处理阶乘逆元的类似方法做到线性。总复杂度是(O(n))。
(
m upd):被打脸了...其实直接用拉格朗日插值公式即可推出和上面一样的东西...所以这篇文章只是想说数学真奇妙。