数论题

给定质数集合 \(S\) 问所有不包含 \(S\) 外质因数的数中有多少 \(\le n\)\(|S|\in\{1,2,3,4,5\},n\in[1,2^{64}]\cap \mathbb{Z}\)

meet in the middle。我先算了一下,在 \(n=2^{64}\) 的情况下,答案大约 \(3\times 10^7\) 个。双向搜索后,空间可以接受。

假设这个质数集排降序过后是 \(\{p_1,p_2,p_3,p_4,p_5\}\),即满足 \(p_1>p_2>p_3>p_4>p_5\)(这里取了 \(|S|\) 最大的情况,其他情况类推)。

\(p_1,p_2,p_3\) 分为一组,暴力求出它们组合后得到小于等于 \(n\) 的答案,构成集合 \(A_1\)。剩余的一组,也求出来,构成集合 \(A_2\)。然后取长度较小的一组,遍历,lower_bound 求每个对应的答案数。

整个算法的时间复杂度是 \(O(\log^{\frac {|S|}2}n+l_{smaller}\log l_{larger})\),其中 \(l_{smaller}\) 指较短数组的长度,\(l_{larger}\) 则是较长的。

posted @ 2022-12-28 20:23  robinyqc  阅读(37)  评论(0)    收藏  举报