【欧拉筛法】洛谷 P3383 线性筛素数

本文介绍了如何使用欧拉筛法解决洛谷P3383问题,即在给定范围内高效找出第k小的素数。通过对比埃氏筛法的复杂度和欧拉筛法的线性效率,阐述了欧拉筛法的优势,并提供了相关代码实现及复杂度分析。
摘要由CSDN通过智能技术生成

3383. 线性筛素数

题目描述

给定一个范围 n,有 q 个询问,每次输出第 k 小的素数。

输入格式:

第一行包含两个正整数 n、q,分别表示查询的范围和查询的个数。
接下来 q 行每行一个正整数 k,表示查询第 k 小的素数。

输出格式:

输出 q 行,每行一个正整数表示答案。

数据范围

  • 对于 100 % 的数据, n = 1 0 8 , 1 ≤ q ≤ 1 0 6 ,保证查询的素数不大于 n 对于100\%的数据,n = 10^8,1\leq q\leq10^6,保证查询的素数不大于 n 对于100%的数据,n=1081q106,保证查询的素数不大于n

输入样例

100 5
1
2
3
4
5

输出样例

2
3
5
7
11

方法一:埃氏筛法

解题思路

假设要求 0 - 20 之间的素数。
从 2 开始遍历每个数,因为 0 和 1 都不是素数。2 是最小的素数。
isPrime 布尔数组标记当前下标是否为素数,true 是素数,false 不是素数。
prime 数组用于存放素数。
方法:
如果 isPrime[i] 为 true,说明 i 为素数,因为它不能被更小的数整除(除了 1),然后把 i 的所有倍数都给划去;
为什么 j = i 呢,而不是等于 2 呢?
因为 i * 2 到 i * (i - 1) 在之前已经被划去,为了避免重复操作,所以 j 从 i 开始。
如果 isPrime[i] 为 false,说明 i 不是素数,它已经被划去了。
在这里插入图片描述
刷题平台的时间限制一般为 1s 或 2s,这就要求操作次数控制在 1 0 7 10^7 107 以内。
因为埃氏筛法的时间复杂度为 O ( n × l o g ( l o g   n ) ) O(n \times log(log\ n)) O(n×log(<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值