Try Again

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;
}

 

posted @ 2017-08-15 18:13  十年换你一句好久不见  阅读(289)  评论(0编辑  收藏  举报