HDU 1431
可以先找出回文数,再用素数测试来判是否为素数即可。
打回文数时,因为左右对称,可以只枚举后半部,然后通过逆转得到前半部分。
#include <iostream>
#include <cstdio>
#include <time.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int Max=200000;
int huiwen[Max],answer[Max];
int htop;
int anter(int i){
int ans=1;
while(i){
ans*=10;
i--;
}
return ans;
}
int gethuiwen(int t,int p){
int ans=0;
while(p>1){
ans*=10;
ans+=(t%10);
p/=10;
t/=10;
}
return ans;
}
void for_back(){
htop=0;
for(int i=5;i<=9;i++)
huiwen[htop++]=i;
for(int i=2;i<=8;i++){
int p=anter(i/2);
// cout<<p<<endl;
if(i%2){
for(int k=0;k<=9;k++){
for(int t=0;t<p;t++){
if(t%10==0) continue;
int tail=gethuiwen(t,p);
// cout<<tail<<' '<<t<<endl;
huiwen[htop++]=(tail*10+k)*p+t;
}
}
}
else{
for(int t=0;t<p;t++){
if(t%10==0) continue;
int tail=gethuiwen(t,p);
huiwen[htop++]=(tail)*p+t;
}
}
}
// cout<<huiwen[htop-1]<<endl;
// for(int i=10;i<=50;i++)
// cout<<huiwen[i]<<endl;
}
long long random(long long n){
return (long long )((double)rand()/RAND_MAX*n+0.5);
}
long long quick(long long a,long long k,long long m){
long long ans=1;
while(k){
if(k&1){
ans=ans*a%m;
}
k>>=1;
a=a*a%m;
}
return ans;
}
bool Miller_Rabin(long long k){
for(int i=1;i<=50;i++){
long long a=random(k-2)+1;
if(quick(a,k-1,k)!=1)
return false;
}
return true;
}
int main(){
srand(time(0));
for_back();
int tmp=htop; htop=0;
// cout<<huiwen[tmp-1]<<endl;
for(int i=0;i<tmp;i++){
// cout<<"NO"<<endl;
if(Miller_Rabin(huiwen[i])){
// cout<<"YES"<<endl;
// break;
huiwen[htop++]=huiwen[i];
}
}
int a,b,ast;
while(scanf("%d%d",&a,&b)!=EOF){
ast=0;
for(int i=0;i<htop;i++){
if(huiwen[i]>=a&&huiwen[i]<=b)
answer[ast++]=huiwen[i];
}
sort(answer,answer+ast);
for(int i=0;i<ast;i++)
printf("%d\n",answer[i]);
cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号