51nod-1181-两次筛法

时间:2020-12-05 09:52:47
题目来源: Sgu
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
51nod-1181-两次筛法 收藏
51nod-1181-两次筛法 关注
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
 
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
    筛法两次就好了。
    
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
#define pii pair<int,int>
#define LL long long
#define mp make_pair
#define pb push_back
#define inf 0x3f3f3f3f bool is[];
vector<int>prime1,prime2;
void init(){
is[]=is[]=;
for(LL i=;i<=;++i){
if(!is[i]){
prime1.push_back(i);
for(LL j=i*i;j<=;j+=i) is[j]=;
}
} memset(is,,sizeof(is));
is[]=is[]=;
for(LL i=;i<=prime1.size();++i){
if(!is[i]){
prime2.push_back(prime1[i-]);
for(LL j=i*i;j<=prime1.size();j+=i)is[j]=;
}
}
}
int main(){
int n;
init();
cin>>n;
cout<<*lower_bound(prime2.begin(),prime2.end(),n)<<endl;
return ;
}