1 条题解
-
0
题意分析
我们要计算不超过 的质数()中,对每个余数 ,满足 的质数个数。
很小,但 可达 。
关键点
- 模 余 的质数:只有 本身(如果 是质数),否则没有。
- 其他余数类中可能有多个质数。
- 需要高效的质数计数算法,并且要按余数分类。
算法选择
小范围 ()
直接埃拉托色尼筛法,统计每个余数类的质数个数。
复杂度 。
大范围 ()
需要用亚线性质数计数法,并且要按模 分类。
这里适合用 Lucy_Hedgehog 筛法(DP 质数计数) 的推广,同时维护 个余数类的计数。
推广的 Lucy_Hedgehog 方法
设 表示 中,模 余 的质数或最小质因子 的数的个数。
初始时(,即最小质因子 ): $ g_r(v, 0) = \text{在 } [2, v] \text{ 中模 } m \text{ 余 } r \text{ 的整数个数} $ 注意要去掉 ,并且 要算入对应余数类。
然后从小到大枚举质数 进行筛除:
对于每个 : $ g_r(v, k) = g_r(v, k-1) - \sum_{\substack{p = p_k \\ p^2 \le v}} \left[ g_{r\cdot p^{-1} \bmod m}\left( \frac{v}{p}, k-1 \right) - g_{r\cdot p^{-1} \bmod m}(p-1, k-1) \right] $ 这里 是 乘上 模 的逆元,因为我们要“回退” 的乘法效应。
更简单的理解:
当我们用 筛时,被筛掉的数是 ,其中 的最小质因子 。
如果 ,则 。
所以要从余数 中减去余数为 的 的计数(去掉 的部分,因为那些 的最小质因子 ,之前已被筛过)。
算法步骤
- 预处理 以内的质数。
- 初始化 ( 中模 余 的整数个数),然后调整去掉 的影响(如果 则减 1)。
- 对每个质数 (从小到大),从大到小更新 (数论分块枚举 )。
- 最终 就是模 余 的质数个数。
样例验证
样例 1:
- 余 0: → 1
- 余 1: → 1
- 余 2: → 2
输出:
1 1 2样例 2:
输出:
0 4784 1 1 0 4806验证:
- 余 0:无(6 不是质数)
- 余 1:很多质数,如 7,13,... 共 4784 个
- 余 2:只有 2
- 余 3:只有 3
- 余 4:无(偶数且大于 2)
- 余 5:很多质数,如 5,11,... 共 4806 个
复杂度
- 时间复杂度:
- 空间复杂度:
- 在 时可行
总结
这道题是按模分类的质数计数问题,通过推广 Lucy_Hedgehog 筛法,同时维护 个余数类的计数,可以高效处理 高达 的情况。关键在于利用模 的逆元来正确转移余数类的关系。
- 1
信息
- ID
- 4029
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者