• 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
    ",answer[i]);
    		cout<<endl;
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    cnetos7设置中文显示及中文输入法
    大数据、云计算和人工智能
    木马可以做什么
    百度搜索语法
    python知识点
    反向代理&集线器和交换机的区别&广播地址&seq与ack的区别
    转台轴承-YRT转台轴承-机床转台轴承选型浅析
    光栅尺与PLC的配合使用
    STM32 keil printf的使用
    keil编写程序完成后debug前面出现绿色框框
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/3959262.html
Copyright © 2020-2023  润新知