Luogu4495
前言
老师给的夯基训练题,感觉已有题解做法复杂度稍高,为此优化之。
一些记号
- \(\tau(P)\) 表示 \(P\) 的因子个数(即 \(\operatorname{d}(P)\))。
- \(\omega(P)\) 表示 \(P\) 的本质不同质因子个数。
思路
把每个数 \(v\) 变为 \(\gcd\{v,P\}\),显然不影响答案。
此时数的种类只有 \(O(\tau(P))\) 种。
则显然此时一种选法合法当且仅当 \(\gcd\{v|v\in\mathcal B\}|w\),其中 \(\mathcal B\) 代表选择的数的集合(背包)。
我们进行质因数分解,则每个数可被唯一分解。
因此在此意义下有良好的偏序关系。
定义每个数 \(v\) 的选法的 GF 为 \(z^P+z^v\)。
不妨考虑对每个数的 GF 在每个质数的幂次上同时做 \(\min\) 卷积,即所谓 \(\gcd\) 卷积。显然此时再做一次 zeta 变换(也即 Dirichlet 前缀和)即得答案系数。
\(\gcd\) 卷积就和我们的交 / 并卷积类似了。
于是考虑调用 CF449D 的套路。
其中乘法指 \(\gcd\) 卷积。
我们把每个 GF 用 FMT 在数论上做一遍,逐项分别乘起来,IFMT 回去,就是 \(\gcd\) 卷积,但这样复杂度不够优(为 \(O(\min\{n,\tau(P)\}\tau(P)\omega(P))\) 的,也即此题大多数题解的复杂度)。
由于无论哪个位置,\(z^P\) 在 FMT 后都会对之施以贡献,所以每个 \(z^v\) 在其所能影响的范围的加上 \(1\) 相当于把 \(1\) 变成 \(2\),也即乘以 \(2\)。
于是不妨令所有 \(v\) 对 \(v\) 位置直接施以 \(+1\) 的贡献,再做一次 FMT,然后在把每个位置的值 \(a\) 变为 \(2^a\),最后再 IFMT 回来。
复杂度分析
至此,复杂度为 \(O(n\log P+q\log P+\tau(P)\omega(P))\),可近似认为是 \(O(n\log P+q\log P+P^{\frac13}\log\log P)\),其中 \(\log P\) 因子来源于 \(\gcd\) 预处理(当然,是对着 \(P\) 的分解式搞)。
对 \(P\) 的质因数分解可用 Pollad-Rho 做到 \(O(P^{\frac14+\epsilon})\),此处不计。
事实上,通过更精细的方法,对 \(n,q\) 旁的 \(\log P\) 因子可以作出进一步优化。
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/Luogu-solution-p4495.html