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

  

posted @ 2014-09-06 11:30  chenjunjie1994  阅读(197)  评论(0编辑  收藏  举报