#include <iostream>
#include <bitset>
#include <cmath>
using namespace std;
const int maxn = 1e8 + 10;
bitset<maxn> st;
int primes[maxn], p = 0;
inline void find(int n){
for (int i = 2; i <= n; i++) {
if (!st[i])primes[++p] = i;
for (int j = 1; primes[j] * i <= n; j++) {
st[primes[j] * i] = 1;
if (i % primes[j] == 0)break;
}
}
return;
}
int main() {
int n, q;
scanf("%d%d", &n,&q);
find(n);
while(q--) {
int k;
scanf("%d", &k);
printf("%d\n", primes[k]);
}
return 0;
}
这是欧拉筛,是时间最短的筛素数方法,任意一个合数都等于几个的质数相乘,120=2*2*2*3*5
那么就可以在i=2的时候标记120为合数,存入primes的时候就可以存入质数,然后输出的时候根据k是几,就输出第几位的质数
欧拉筛和埃氏筛的区别就在于,120=2*2*2*3*5,那么循环到2,3,5的时候都会标记120,可是标记一次就已经够了,所以多了 if (i % primes[j] == 0)break;来减少标记次数,提高效率