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\) 代表选择的数的集合(背包)。

我们进行质因数分解,则每个数可被唯一分解。

\[P=\prod p_k^{a_k},v=\prod p_k^{b_k}(b_k\le a_k) \]

因此在此意义下有良好的偏序关系。

定义每个数 \(v\) 的选法的 GF 为 \(z^P+z^v\)

不妨考虑对每个数的 GF 在每个质数的幂次上同时做 \(\min\) 卷积,即所谓 \(\gcd\) 卷积。显然此时再做一次 zeta 变换(也即 Dirichlet 前缀和)即得答案系数。

\(\gcd\) 卷积就和我们的交 / 并卷积类似了。

于是考虑调用 CF449D 的套路。

\[\prod z^P+z^v \]

其中乘法指 \(\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\) 因子可以作出进一步优化。

posted @ 2022-07-29 18:16  myee  阅读(52)  评论(0编辑  收藏  举报