文章目录
题目描述
给定一个范围 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=108,1≤q≤106,保证查询的素数不大于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(<