纠结了这么久,追求一些莫名其妙的东西,似乎还不一定能得到。
还是回到这个充实的地方,重新开始。
做点水题热身。
hdu1431 找出一个范围内的回文素数。
观察数据范围,5到99999999之间。
回文数的通常做法,暴力枚举回文的一半,构造出另一半。
这样我们只要枚举1到9999,来构造回文数。
构造出数后,加上素数判定,预处理素数,暴力枚举判定,10000以内的素数有1000多个。
还有每个数的一些处理,这样大概在100000000左右的复杂度。
居然15ms通过。
还是回到这个充实的地方,重新开始。
做点水题热身。
hdu1431 找出一个范围内的回文素数。
观察数据范围,5到99999999之间。
回文数的通常做法,暴力枚举回文的一半,构造出另一半。
这样我们只要枚举1到9999,来构造回文数。
构造出数后,加上素数判定,预处理素数,暴力枚举判定,10000以内的素数有1000多个。
还有每个数的一些处理,这样大概在100000000左右的复杂度。
居然15ms通过。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define NN 20100
int pr[NN],isp[NN],pn,st,ed,sa[20],sv[50100],sn;
void get_prime(){
pn=0;
int i,j;
memset(isp,0,sizeof(isp));
for(i=2;i<=11000;++i)if (isp[i]==0){
pr[++pn]=i;
for(j=i*i;j<=11000;j+=i) isp[j]=1;
}
printf("%d\n",pn);
}
int judge(int a){
int i;
for(i=1;i<=pn&&pr[i]*pr[i]<=a;++i){
if (a%pr[i]==0) return 0;
}
return 1;
}
void getnum1(int i){
int ti=i;
int k=0;
int j,tmp;
while(ti){
sa[++k]=ti%10;
ti=ti/10;
}
if (sa[k]%2==0) return;
tmp=0;
for(j=k;j>1;j--){
tmp=tmp*10+sa[j];
}
for(j=1;j<=k;++j){
tmp=tmp*10+sa[j];
}
if (tmp<st||tmp>ed) ;
else
if (judge(tmp)) sv[++sn]=tmp;
tmp=0;
for(j=k;j>=1;j--){
tmp=tmp*10+sa[j];
}
for(j=1;j<=k;++j){
tmp=tmp*10+sa[j];
}
if (tmp<st||tmp>ed) ;
else
if (judge(tmp)) sv[++sn]=tmp;
}
int main(){
int i;
get_prime();
while(scanf("%d%d",&st,&ed)!=EOF){
sn=0;
for(i=1;i<=9999;++i){
getnum1(i);
}
sort(sv+1,sv+sn+1);
for(i=1;i<=sn;++i){
printf("%d\n",sv[i]);
}
printf("\n");
}
return 0;
}