洛谷 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;
}
posted @ 2020-12-03 15:54  Seaway-Fu  阅读(177)  评论(0编辑  收藏  举报