51Nod 1181 质数中的质数(质数筛法)
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #define lowbit(x) (x&(-x)) #define max(x,y) (x>y?x:y) #define min(x,y) (x<y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.141592653589793238462 #define ios() ios::sync_with_stdio(false) #define INF 1044266558 #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; int prime[1000006]; int p[10000006],n; void get_prime() { memset(p,0,sizeof(p)); int pos=0; for(int i=2;i<10000005;i++) { if(p[i]) continue; prime[++pos]=i; if(pos>=1000007) break; for(int j=2;j*i<10000005;j++) p[j*i]=1; } } int main() { get_prime(); while(scanf("%d",&n)!=EOF) { int i,j; for(i=1;i!=1000007;i++) { if(prime[i]>=n) { break; } } for(int j=1;;j++) { if(prime[j]>=i) { printf("%d\n",prime[prime[j]]); break; } } } return 0; }