解题代码
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn = 100000010;
ll n, q;
int prime[maxn / 10]; //存储素数(从下标1开始,并且素数大小是升序的)
bool isprime[maxn + 1];
//欧拉筛
void Prime() {
memset(isprime, 1, sizeof(isprime)); //一开始把全部数初始化为素数,后面把不是素数的数筛选掉
isprime[0] = 0; //0不是素数
isprime[1] = 0; //1不是素数
for(int i = 2; i <= maxn; i++) {
if (isprime[i]) {
prime[++prime[0]] = i; //记录素数,prime[0]相当于cnt,用来记录素数的个数
}
for(int j = 1; j <= prime[0] && i * prime[j] <= maxn; j++) {
ll temp = (ll)i * prime[j];
isprime[temp] = 0;
if (i % prime[j] == 0) break; //跳出循环
}
}
}
//埃氏筛法
/*void Prime() {
memset(isprime, 1, sizeof(isprime)); //一开始把全部数初始化为素数,后面把不是素数的数筛选掉
isprime[0] = isprime[1] = 0; //0和1不是素数
for (int i = 2; i <= maxn; i++) {
if (isprime[i]) { //如果i是素数,让i的所有倍数都不是素数
prime[++prime[0]] = i;
for (ll j = (ll)i * i; j <= maxn; j += i) {
isprime[j] = 0;
}
}
}
}*/
int main()
{
Prime();
int cnt = prime[0]; //cnt为素数的个数
cin >> n >> q;
int k;
while (q--) {
cin >> k;
cout << prime[k] << endl;
}
return 0;
}