洛谷P3383 【模板】线性筛素数
TITLE
思路
每个合数只被筛一次
for(b[1]=1,i=2;i<=n;++i)
{
if(!b[i])z[++tot]=i;//标记质数
for(j=1;j<=tot&&i*z[j]<=n;++j)//用每个质数*i筛合数
{
b[i*z[j]]=1;//标记为合数
if(!(i%z[j]))break;//如果(第j个质数)整除i,那么后面的数(=i*x)会被(第j个质数*x*(i/第j个质数))筛掉
}
}
CODE
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100000000;
int z[maxn+10];
bool b[maxn+10];
int main()
{
int n,k,x,i,j,tot=0;
scanf("%d%d",&n,&k);
for(b[1]=1,i=2;i<=n;++i)
{
if(!b[i])z[++tot]=i;
for(j=1;j<=tot&&i*z[j]<=n;++j)
{
b[i*z[j]]=1;
if(!(i%z[j]))break;
}
}
for(i=1;i<=k;++i)
scanf("%d",&x),printf("%d\n",z[x]);
return 0;
}