感谢@Duan2baka 指出一处错误
这道题很多人可能会以为要求的东西是有性质
然而确实有预处理$O($值域$)$预处理 $O(1)$查询的方法
首先用线性筛预处理,可以把大多数的数分解成三个不大于$O(\sqrt n)$的数的乘积
如果分解出来大于$O(\sqrt n)$的话,一定是一个质数
具体方法:
1.找出一个数$x$的最小质因子$p$,并得到$\frac xp$的分解
2.把$p$乘到最小的数上即可
证明一下为什么是对的
考虑归纳法
只需证明把$p$乘上最小的数后得到的结果一定不大于$\sqrt n$
$\frac np$分解中最小的一个数$a$一定不大于$\sqrt[3]\frac np$
$a\times p\leq\sqrt[3] \frac np \times p$
当$p > \sqrt[4] n$时,显然分解出的三个数为它的三个质因子,成立
否则$a\times p\leq\sqrt[3]\frac n{\sqrt[4] n}\times\sqrt[4]n=\sqrt n$
证毕
于是乎,对于每次询问就可以把一个数分解
然后第一次暴力取一下膜
值域就变为了$O(\sqrt v)$
于是就可以打一个$O(\sqrt v)\times O(\sqrt v)$的表
$O(v)-O(1)$
1 |
|