首先把给定的多项式转成牛顿级数,即转写成 F(x)=k−1∑i=0ai(xi)
让我们考虑一个错排,显然它是由非自环的循环置换为基本单位构成的,即 e−x−ln(1−x)
然后考虑从中选 k 个。不难发现这只需要对一个循环置换附加一个因子 (1+y) 即可做到: e(1+y)(−x−ln(1−x))
令其为 G,考虑求算 k−1∑i=0ai[yi]G
直接计算是困难的;但是我们不妨考虑应用转置原理,首先考虑 k−1∑i=0ai[xi]G
设 Fi=[xi]G,对 x 求导可以得到 ∂G∂x=(1+y)x1−xG
即 iFi=(i−1)Fi−1+(1+y)Fi−2
考虑构造矩阵满足 [FiFi−1]=[Fi−1Fi−2]Ai
不妨假定 F−1=1。
那么我们要求的其实就是 n−1∑i=0[ai0]A1A2⋯Ai
用线性算法描述就是 A[[a00][a10]⋮[an−10]]
其中 Aij=[yi]A0A1⋯Aj
我们在计算此问题时,使用分治,同时维护当前区间乘出来的列向量 res,合并时 res=resL+ΠLresR
而在递归到长度为 1 的区间时,让 res 返回其左乘 ai 的向量的结果。
其中 ΠL 表示左区间的 Ai 之积。
那么我们的转置其实就已经明晰了。分治时传入一个 2 维行向量的列向量 res,分治时 resL←res,resR←res×TΠTL
然后递归进入子问题计算。
时间复杂度瓶颈为转牛顿级数,总复杂度 O(klog2k+nlog2n)。
代码:
1 |
|