题目背景
本题已更新,从判断素数改为了查询第 kk 小的素数
提示:如果你使用 cin 来读入,建议使用 std::ios::sync_with_stdio(0) 来加速。
题目描述
如题,给定一个范围 nn,有 qq 个询问,每次输出第 kk 小的素数。
输入格式
第一行包含两个正整数 n,qn,q,分别表示查询的范围和查询的个数。
接下来 qq 行每行一个正整数 kk,表示查询第 kk 小的素数。
输出格式
输出 qq 行,每行一个正整数表示答案。
输入输出样例
输入 #1复制
100 5 1 2 3 4 5
输出 #1复制
2 3 5 7 11
说明/提示
【数据范围】
对于 100\%100% 的数据,n = 10^8n=108,1 \le q \le 10^61≤q≤106,保证查询的素数不大于 nn。
Data by NaCly_Fish.
这道题用埃式筛解题也不是不可以,不过应该会超时
所以这道题考察我们的应该是线性筛(即欧拉筛,下同)
而欧拉筛法的思想非常简单,就是我们要求每一个数都被且仅被其最小的质因数筛掉(这也是欧拉筛对于埃氏筛法的一个优化),这使得它的时间复杂度仅有O(n)
而有些同学可能要问了:埃式筛又是什么呢?
埃式筛的大体思想:要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。(详见百度百科)

该博客介绍了如何使用线性筛(欧拉筛)算法解决大范围内的素数查询问题,避免了埃式筛可能导致的超时。文章详细解释了线性筛的工作原理,即每个数仅被其最小质因数筛掉,从而达到O(n)的时间复杂度。博主给出了C++实现代码,并提醒注意数据类型的选择以避免爆空间。此外,还提及了埃式筛的基本思想作为对比。
最低0.47元/天 解锁文章
438

被折叠的 条评论
为什么被折叠?



