题目来源: Sgu
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数。例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数。现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做)。
Input
输入一个数N(N <= 10^6)
Output
输出>=N的最小的质数中的质数。
Input示例
20
Output示例
31
最常见的筛法是筛去素数的倍数,但很显然这样会大量重复筛去相同的元素(虽然比筛去整数的倍数好)。而由合数的定义可以看出,合数必然有复数个数的素因子,我们只需要在第一个素因子处判断即可,否则会重复。
而这道题需要在筛法的基础上加一次判断。
【思路来自http://blog.csdn.net/morewindows/article/details/7347459】
//代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool su[100000000];
int shu[2000500],shusu[2000500];
int shai(int a){
int i=2,j,k=1,l=1;
while(shusu[l-1]<a){
if(!su[k-1]&&shusu[l-1]!=shu[k-1])
shusu[l++]=shu[k-1];
if(!su[i]) shu[k++]=i;
for(j=1;j<=k&&i*shu[j]<=a*10;j++)
{
su[i*shu[j]]=true;
if(i%shu[j]==0) break;
}
i++;
}
l--;
return l;
}
int main()
{
int n;
cin>>n;
// for(int i=1;i<=shai(n);i++) cout<<shusu[i]<<" ";
cout<<shusu[shai(n)]<<endl;
return 0;
}