素数筛法——欧拉筛
原创
©著作权归作者所有:来自51CTO博客作者PanDaoxi的原创作品,请联系作者获取转载授权,否则将追究法律责任
直接输出:
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e8 + 1;
int prime[INF];
bool vis[INF];
int Euler(int n, int k=0){
for(int i=2; i<=n; i++){
if(vis[i] == 0) prime[k++] = i;
for(int j=0; j<k; j++){
if(i*prime[j] > n) break;
vis[i*prime[j]] = true;
if(!(i%prime[j])) break;
}
}
return k;
}
int main(){
int n = Euler(INF);
for(int i=0; i<n; i++){
printf("%d\t", prime[i]);
}
return 0;
}
洛谷模板题:
【模板】线性筛素数
题目背景
本题已更新,从判断素数改为了查询第 小的素数
提示:如果你使用 cin
来读入,建议使用 std::ios::sync_with_stdio(0)
来加速。
题目描述
如题,给定一个范围 ,有 个询问,每次输出第
输入格式
第一行包含两个正整数 ,分别表示查询的范围和查询的个数。
接下来 行每行一个正整数 ,表示查询第
输出格式
输出
样例 #1
样例输入 #1
样例输出 #1
提示
【数据范围】
对于 的数据,,,保证查询的素数不大于 。
Data by NaCly_Fish.
// Author:PanDaoxi
#include <bits/stdc++.h>
using namespace std;
int n, q;
const int INF = 1e8 + 1;
int prime[INF];
bool vis[INF];
void Euler(int n, int k=0){
for(int i=2; i<=n; i++){
if(vis[i] == 0) prime[k++] = i;
for(int j=0; j<k; j++){
if(i*prime[j] > n) break;
vis[i*prime[j]] = true;
if(!(i%prime[j])) break;
}
}
}
int main(){
cin >> n >> q;
Euler(INF);
for(int i=0, x; i<q; i++){
cin >> x;
cout << prime[x-1] << endl;
}
return 0;
}