多项式多点求值
给定nnn个值xix_ixi,求f(xi)f(x_i)f(xi)。
设f0(x)=∑i=0n2−1f(xi)f_0(x)=\sum_{i=0}^{\frac{n}{2}-1}f(x_i)f0(x)=∑i=02n−1f(xi),P0(x)=∏i=0n2−1x−xiP_0(x)=\prod_{i=0}^{\frac{n}{2}-1}x-x_iP0(x)=∏i=02n−1x−xi。则有f(x)=P0(x)z(x)+f0(x)f(x)=P_0(x)z(x)+f_0(x)f(x)=P0(x)z(x)+f0(x)其中z(x)z(x)z(x)是某一多项式。
于是对于i<n2i<\frac{n}{2}i<2n,有f(xi)=(f mod P0)(xi)f(x_i)=(f\bmod P_0)(x_i)f(xi)=(fmodP0)(xi)。后一半同样。递归计算即可,每次用分治卷积和多项式取模,复杂度为O(nlog2n)O(n\log^2n)O(nlog2n)。
多项式快速插值
给定nnn个二元组(xi,yi)(x_i,y_i)(xi,yi),求F(x)F(x)F(x)使F(xi)=yiF(x_i)=y_iF(xi)=yi。
由拉格朗日插值公式,F(x)=∑i∏j≠i(x−xj)∏j≠i(xi−xj)⋅yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{\prod_{j=\not i}(x_i-x_j)}\cdot y_iF(x)=i∑∏j≠i(xi−xj)∏j≠i(x−xj)⋅yi
设M(x)=∏i(x−xi)M(x)=\prod_i(x-x_i)M(x)=∏i(x−xi),则F(x)=∑i∏j≠i(x−xj)M(xi)xi−xi⋅yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{\frac{M(x_i)}{x_i-x_i}}\cdot y_iF(x)=i∑xi−xiM(xi)∏j≠i(x−xj)⋅yiF(x)=∑i∏j≠i(x−xj)M′(xi)⋅yiF(x)=\sum_i\frac{\prod_{j=\not i}(x-x_j)}{M'(x_i)}\cdot y_iF(x)=i∑M′(xi)∏j≠i(x−xj)⋅yi
此时可以用多项式多点求值求出所有的M′(xi)M'(x_i)M′(xi)。设Ai=yiM′(xi)A_i=\frac{y_i}{M'(x_i)}Ai=M′(xi)yi,则等式变为F(x)=∑iAi∏j≠i(x−xj)F(x)=\sum_iA_i\prod_{j=\not i}(x-x_j)F(x)=i∑Aij≠i∏(x−xj)
分治即可。设两半边答案分别为F0(x)F_0(x)F0(x)、F1(x)F_1(x)F1(x),则F(x)=F0(x)∏i=mid+1r(x−xi)+F1(x)∏i=lmid(x−xi)F(x)=F_0(x)\prod_{i=mid+1}^r(x-x_i)+F_1(x)\prod_{i=l}^{mid}(x-x_i)F(x)=F0(x)i=mid+1∏r(x−xi)+F1(x)i=l∏mid(x−xi)
复杂度为O(nlog2n)O(n\log^2n)O(nlog2n)。
*2019.01.11 13:30:18
线性递推数列
给定长为mmm的数列a0,a1,⋯ ,am−1a_0,a_1,\cdots,a_{m-1}a0,a1,⋯,am−1,给定f(i)(i<m)f(i)(i<m)f(i)(i<m),已知对于任意i≥mi\ge mi≥m有f(i)=∑j=0m−1ajf(i−j)f(i)=\sum_{j=0}^{m-1}a_jf(i-j)f(i)=∑j=0m−1ajf(i−j),求f(n)f(n)f(n)。
n=1018n=10^{18}n=1018,m=3×104m=3\times 10^4m=3×104。
设数列AAA满足fn=∑i=0∞Aifif_n=\sum_{i=0}^\infty A_if_ifn=∑i=0∞Aifi,则我们容易得到一个合法的数列AAA即Ai′={0(i≠n)1(i=n)A'_i=\begin{cases}0(i=\not n)\\1(i=n)\end{cases}Ai′={0(i≠n)1(i=n)。若我们求得一个AAA使其非零项的下标都在[0,m−1][0,m-1][0,m−1],则我们可以立即求得f(n)f(n)f(n)。现在考虑将A′A'A′变形。
原等式变形得f(i)−∑j=0i−1ajf(i−j)=0f(i)-\sum_{j=0}^{i-1}a_jf(i-j)=0f(i)−j=0∑i−1ajf(i−j)=0设多项式Bi(x)=f(i)−∑j=0i−1ajf(i−j)B_i(x)=f(i)-\sum_{j=0}^{i-1}a_jf(i-j)Bi(x)=f(i)−∑j=0i−1ajf(i−j),则其恒等于000。
考虑这样一个过程:我们已有一个合法的AAA,其最高的非零项为AkA_kAk,现将AAA赋值为A−BkA-B_kA−Bk,则其值不变,而最高非零项的下标严格减少。因此我们对A′A'A′不断做这个过程即可得到我们想要的AAA。
事实上,“不断做这个过程”等价于将A′A'A′对Bm−1B_{m-1}Bm−1取模。用多项式取模,我们就在O(mlognlogm)O(m\log n\log m)O(mlognlogm)的时间复杂度内解决了问题。*2018.12.5