博客
关于我
P1865 A % B Problem
阅读量:798 次
发布时间:2023-02-26

本文共 2034 字,大约阅读时间需要 6 分钟。

区间质数个数问题的解法

问题背景

最近,我遇到了一个编程题,题目是关于区间内质数的个数统计。这个题目看起来不复杂,但实际上却隐藏了一些需要注意的地方。题目名称虽然吸引人,但实际内容却相当实用。

问题描述

题目要求,对于给定的多个区间 [l, r],统计每个区间内质数的个数。需要注意的是,输入的 lr 有可能超出给定的范围 [1, m],这种情况下应该输出 "Crossing the line"。

输入输出格式

输入格式

  • 第一行:两个整数 nm,分别表示询问次数和范围上限。
  • 接下来的 n 行,每行包含两个整数 lr,表示区间。

输出格式

  • 对于每个询问,输出质数的个数。如果 lr 超出范围 [1, m],则输出 "Crossing the line"。

输入输出样例

输入样例#1:

2 51 32 651 326 32

输出样例#1:

Crossing the line2

问题分析

这个问题看似简单,但要实现高效的解决方案,需要注意以下几点:

  • 质数判断方法:不能直接在区间内逐个判断每个数是否为质数,尤其是当 m 较大时,这种方法会非常低效。
  • 预处理数据:通过预处理生成一个质数标记数组,这样可以在 O(1) 时间内查询区间内质数的个数。
  • 范围检查:需要对输入的 lr 进行有效性检查,确保它们在合理范围内。
  • 贪心算法思路

    质数的分布具有某种规律性,可以利用贪心算法结合筛选法来预处理质数。具体来说:

  • 预处理质数数组:生成一个布尔数组 f,其中 f[i] 表示 i 是否为质数。
  • 质数筛选:通过筛选的方法标记出所有质数。对于非质数,直接将其标记为 0,质数则标记为 1
  • 前缀和数组:构建一个前缀和数组 f,其中 f[i] 表示从 1i 的质数个数。这样可以快速计算任意区间 [l, r] 内质数的个数。
  • 代码实现

    #include 
    #include
    #include
    #include
    #include
    using namespace std;bool judge(int x) { if (x <= 1) return false; for (int i = 2; i * i <= x; ++i) { if (x % i == 0) return false; } return true;}int main() { scanf("%d%d", &n, &m); int f[m + 1]; for (int i = 1; i <= m; ++i) { if (judge(i)) { f[i] = f[i - 1] + 1; } else { f[i] = f[i - 1]; } } for (int i = 1; i <= n; ++i) { int l, r; scanf("%d%d", &l, &r); if (l < 1 || l > m || r < 1 || r > m) { printf("Crossing the line\n"); } else { int count = f[r] - f[l - 1]; printf("%d\n", count); } } return 0;}

    代码解释

  • 质数判断函数judge(int x) 函数用于判断一个数是否为质数。通过试除法,从 2sqrt(x) 检查是否有因数。
  • 预处理质数数组:在 main 函数中,首先读取输入参数 nm。然后初始化一个数组 f,用于记录每个数是否为质数。
  • 构建前缀和数组:通过遍历 1m 的每个数,使用 judge 函数判断是否为质数,并根据结果更新前缀和数组 f
  • 处理每个查询:对于每个查询,读取 lr,并检查它们是否在有效范围内。如果超出范围,输出 "Crossing the line";否则,通过前缀和数组快速计算区间内的质数个数并输出。
  • 优化建议

  • 负数处理:注意题目中提到可能有负数输入,需要在处理输入时进行有效性检查。
  • 性能优化:对于大范围的 m,使用筛选法预处理质数是高效的选择。避免在查询时逐个判断每个数是否为质数,这会导致超时。
  • 代码简化:可以将质数判断函数 judge 简化,直接在预处理阶段完成质数标记,这样可以提高处理速度。
  • 通过以上方法,可以高效地解决区间质数个数的问题,确保在大数据范围内也能快速响应。

    转载地址:http://xdvfk.baihongyu.com/

    你可能感兴趣的文章
    oobbs开发手记
    查看>>
    OpenCV 中的图像转换
    查看>>
    opencv&Python——多种边缘检测
    查看>>
    OpenCV-Python接口、cv和cv2的性能比较
    查看>>
    opencv26-模板匹配
    查看>>
    opencv32-基于距离变换和分水岭的图像分割
    查看>>
    opencv4-图像操作
    查看>>
    opencv5-图像混合
    查看>>
    opencv9-膨胀和腐蚀
    查看>>
    OpenCV与AI深度学习 | YOLO11介绍及五大任务推理演示(目标检测,图像分割,图像分类,姿态检测,带方向目标检测)
    查看>>
    OpenCV与AI深度学习 | 使用Python和OpenCV实现火焰检测(附源码)
    查看>>
    OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
    查看>>
    OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
    查看>>
    OpenCV与AI深度学习 | 基于GAN的零缺陷样本产品表面缺陷检测
    查看>>
    OpenCV与AI深度学习 | 基于OpenCV和深度学习预测年龄和性别
    查看>>
    OpenCV与AI深度学习 | 基于Python和OpenCV将图像转为ASCII艺术效果
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>