洛谷 P3383 【模板】线性筛素数
洛谷 P3383 【模板】线性筛素数
题目背景
本题已更新,从判断素数改为了查询第 kk 小的素数
提示:如果你使用 cin
来读入,建议使用 std::ios::sync_with_stdio(0)
来加速。
题目描述
如题,给定一个范围 nn,有 qq 个询问,每次输出第 kk 小的素数。
输入格式
第一行包含两个正整数 n,qn,q,分别表示查询的范围和查询的个数。
接下来 qq 行每行一个正整数 kk,表示查询第 kk 小的素数。
输出格式
输出 qq 行,每行一个正整数表示答案。
题解:
唯一的难点是判断素数个数。
答案是\(\frac{x}{\ln x}\)个。大约。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=6e6+6;
const int maxw=1e8+8;
int prime[maxn],cnt;
bool v[maxw];
void euler(int x)
{
cnt=0;
for(int i=2;i<=x;i++)
{
if(!v[i])
prime[++cnt]=i,v[i]=1;
for(int j=1;j<=cnt&&i*prime[j]<=x;j++)
{
v[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
euler(n);
sort(prime+1,prime+cnt+1);
while(q--)
{
int k;
scanf("%d",&k);
printf("%d\n",prime[k]);
}
return 0;
}