社论「不 CDQ 的分治 NTT」(详细揭秘)
这里「CDQ 分治 NTT」指的是(半)在线卷积,用这个名字仅是区分两种分治。
这是一篇在学术方面相对 trivial 的文章,主要是总结一些传统的非 CDQ 分治 NTT 的基本技巧。
求若干次数和一定的多项式之积
若有多项式
在实现方面,一个常见的误区是认为必须合并果子地执行分治。事实上并不是,直接在中点分治的复杂度也是正确的。
求若干次数和一定的有理分式之和
若有有理分式
分治时维护分子和分母并实时通分即可。
处理一些路径相关的树上问题
经典问题是统计所有长度的路径条数,其他形式也多半是不超过路径长度的若干信息通过直接拼接的卷积来合并。
那么我们可以用点分治 NTT 在
实现上需要注意的细节是,合并时必须按照多项式度数从小到大执行合并。
结合矩阵
这个相对比较 trivial,大概就是利用矩阵乘法和 NTT 执行乘法,并用分治平衡复杂度。
求前缀积之和及相关衍生问题
能做的东西大概是对于多项式
状物。
考虑维护区间的
换成矩阵也是一样的。
处理右复合
考虑多项式
在
例:[数据删除] from Mivik
[数据删除]
[数据删除]
[数据删除]
听说这题被O(n) 干爆了,懒得写了(
结合转置原理
在适当的时候考察对应问题的转置,若其能够使用分治 NTT 解决,那么转置就可以解决原问题。
处理右复合
考虑多项式
那么考虑其转置就是
若
例:Feux Follets
对于给定的多项式F(z) ,考虑计算F\left(\ln\frac1{1-z}-z\right) 。传送门
处理一些和深度相关的树上问题
基本形式是刚才的问题上树,前缀变成到根的链。
通常考虑首先确认一条链上如何处理,然后加上一个长链剖分。
例:
( 「2020-2021 集训队作业」Tree & Primes)^T
对于给定的树和序列a,p ,考虑计算\sum\limits_u a_u \prod\limits_{i\in \mathrm{Path}(1,u)} (p_i x + 1 - p_i) 将先前提到的算法加上长链剖分即可。
处理一些和子树大小相关的树上问题
也就是优化树上背包。
即结合静态链分治(重链剖分 / dsu on tree / 全局平衡二叉树)。
不过这个 trick 通常需要结合矩阵,复杂度一般来说是
例:Stranger Trees
给定一棵n 个点的树,求出与这棵树恰有k 条边重合的树的个数。记
F(z,t) 是钦定若干条边重合的生成函数,z 计量点数,t 计量钦定的边数。
那么求出[z^n] F(z,t) 后复合t-1 即可(二项式反演)。
对于[z^n] F(z,t) ,我们考虑 Prufer 序列 / Matrix-Tree 定理/ 多元拉格朗日反演导出的经典结论,可以通过组合意义或是对生成函数的求导转化为树上背包问题。
这样应用上述算法即可做到O(n \log^3 n) 或O(n \log^2 n) 。