1 条题解
-
0
题意分析
我们要计算 的质数 中,二进制表示末两位为 的个数。
二进制末两位为 意味着: 因为:
- 末位 1 表示 是奇数
- 倒数第二位 0 表示
所以问题转化为:计算不超过 的质数中,模 余 的个数。
模 4 余 1 的质数分布
除了 以外,所有质数都是奇数,所以模 只能是 或 。
- 模 余 1 的质数:
- 模 余 3 的质数:
注意 是特殊情况,但题目要求 ,且 的二进制是 ,末两位 不符合 ,所以 不计算在内。
算法选择
很大,需要高效的质数计数算法。
1. 小范围 ()
可以用埃拉托色尼筛法,直接筛出所有质数,然后统计模 余 的个数。
复杂度 ,空间 。
2. 大范围 ()
需要用亚线性质数计数法,如:
- Meissel-Lehmer 算法
- Lucy_Hedgehog 筛法(动态规划质数计数)
- 洲阁筛 / Min_25 筛
这里我们选择 Lucy_Hedgehog 方法(也称为“数论分块 + DP”质数计数),它可以方便地统计模 余 和余 的质数个数。
Lucy_Hedgehog 方法思路
设 表示 中最小质因子 的数的个数(或某种属性之和)。
我们想分别计算:
- = 模 余 的质数个数
- = 模 余 的质数个数
初始时, 表示 中所有奇数个数(因为最小质因子 就是所有 的数,但要考虑模 4 分类)。
更直接的方法是:
用 DP 计算 = 中质数或最小质因子 的数的个数( 是第 个质数)。然后利用: 我们可以修改状态,同时记录模 余 和余 的计数。
具体实现方案
我们维护两个数组:
- = 中模 余 的质数或最小质因子 的数的个数
- = 中模 余 的质数或最小质因子 的数的个数
初始时(,即最小质因子 ):
- 对于 ,(模 4 余 1 的整数个数,从 1 开始算,但要去掉 1)
- 对于 ,(模 4 余 3 的整数个数)
然后从小到大枚举质数 进行筛除:
- 如果 ,筛的时候会影响 和 的分布
- 如果 ,同理
转移公式: $ g_j[v] \leftarrow g_j[v] - \left( g_{j\cdot p \bmod 4}\left[ \frac{v}{p} \right] - g_{j\cdot p \bmod 4}[p-1] \right) $ 这里 是当前考虑的余数类(1 或 3), 是乘 后的余数类。
算法步骤
- 预处理 以内的质数。
- 初始化 为初始计数(去掉 1,保留质数和合数)。
- 对每个质数 ,从大到小更新 (数论分块枚举 )。
- 最终 就是模 余 的质数个数(因为所有合数被筛掉,只剩质数)。
样例验证
样例 1:
模 余 的质数:,共 个,输出 。
样例 2:
输出 。
复杂度
- 时间复杂度:
- 空间复杂度:
- 可处理 级别
总结
这道题本质是模 4 余 1 的质数计数问题,通过将二进制末两位条件转化为模 条件,再利用高效的亚线性质数计数算法(如 Lucy_Hedgehog 法)求解,可以处理 高达 的情况。
- 1
信息
- ID
- 4026
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 8
- 已通过
- 1
- 上传者