多项式多点求值
给定n个值xi,求f(xi)。
设f0(x)=∑i=02n−1f(xi),P0(x)=∏i=02n−1x−xi。则有f(x)=P0(x)z(x)+f0(x)其中z(x)是某一多项式。
于是对于i<2n,有f(xi)=(fmodP0)(xi)。后一半同样。递归计算即可,每次用分治卷积和多项式取模,复杂度为O(nlog2n)。
多项式快速插值
给定n个二元组(xi,yi),求F(x)使F(xi)=yi。
由拉格朗日插值公式,F(x)=i∑∏j≠i(xi−xj)∏j≠i(x−xj)⋅yi
设M(x)=∏i(x−xi),则F(x)=i∑xi−xiM(xi)∏j≠i(x−xj)⋅yiF(x)=i∑M′(xi)∏j≠i(x−xj)⋅yi
此时可以用多项式多点求值求出所有的M′(xi)。设Ai=M′(xi)yi,则等式变为F(x)=i∑Aij≠i∏(x−xj)
分治即可。设两半边答案分别为F0(x)、F1(x),则F(x)=F0(x)i=mid+1∏r(x−xi)+F1(x)i=l∏mid(x−xi)
复杂度为O(nlog2n)。
*2019.01.11 13:30:18
线性递推数列
给定长为m的数列a0,a1,⋯,am−1,给定f(i)(i<m),已知对于任意i≥m有f(i)=∑j=0m−1ajf(i−j),求f(n)。
n=1018,m=3×104。
设数列A满足fn=∑i=0∞Aifi,则我们容易得到一个合法的数列A即Ai′={0(i≠n)1(i=n)。若我们求得一个A使其非零项的下标都在[0,m−1],则我们可以立即求得f(n)。现在考虑将A′变形。
原等式变形得f(i)−j=0∑i−1ajf(i−j)=0设多项式Bi(x)=f(i)−∑j=0i−1ajf(i−j),则其恒等于0。
考虑这样一个过程:我们已有一个合法的A,其最高的非零项为Ak,现将A赋值为A−Bk,则其值不变,而最高非零项的下标严格减少。因此我们对A′不断做这个过程即可得到我们想要的A。
事实上,“不断做这个过程”等价于将A′对Bm−1取模。用多项式取模,我们就在O(mlognlogm)的时间复杂度内解决了问题。*2018.12.5