[欧拉筛][洛谷]线性筛素数
线性筛素数
解析
这里运用欧拉筛。
欧拉筛是埃氏筛法的改进版。
例如,在埃氏筛法里,对于 \(12\) 有 &2 * 6& 和 \(3 * 4\) 两种情况筛到,如果以一种方法能够让一个数只能被筛过一次,就能够进一步提高算法效率。
Code
#include <bits/stdc++.h>
#define N 100000008
using namespace std;
int n, q;
int hhd[N], hd[N];
void ols ()
{
int wa = 0;
memset (hhd, 1, sizeof (hhd));
hhd[1] = 0;
for (int i = 2; i <= n; ++ i)
{
if (hhd[i]) hd[++ wa] = i;
for (int j = 1; j <= wa && i * hd[j] <= n; ++ j)
{
hhd[i * hd[j]] = 0;
if (i % hd[j] == 0) break;
}
}
}
int main ()
{
scanf ("%d%d", &n, &q);
ols ();
for (int i = 1; i <= q; ++ i)
{
int ank;
scanf ("%d", &ank);
printf ("%d\n", hd[ank]);
}
return 0;
}