[낙곡] P1217 [USACO1.5] 회문질수Prime Palindromes(시뮬레이션)

13883 단어
원본 주소:https://www.luogu.org/problem/P1217
제목 설명
151은 하나의 질수이자 하나의 회문수이기 때문에 151은 회문수이다.
프로그램 하나를 써서 범위 [a, b](5≤a입력 형식:
첫 번째 줄: 두 개의 정수 a와 b.
출력 형식:
회문 질수의 목록을 한 줄씩 출력합니다.출력 샘플 가져오기
샘플 #1 입력:
5 500
샘플 내보내기 #1:
5 7 11 101 131 151 181 191 313 353 373 383 설명
시공 제한: 1000ms, 128M
Hint 1: Generate the palindromes and see if they are prime.
제시1: 모든 회문수를 찾아서 그것들의 질수(소수)를 판단한다.
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
힌트2: 정확한 회문수를 만들려면 아래와 같은 순환이 몇 개 필요할 수도 있다.
제목 번역은 NOCOW에서 나왔다.
USACO Training Section 1.5
길이가 5인 회신 수 생성:
for (d1 = 1; d1 <= 9; d1+=2) {    //          
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
           palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(     ...)
         }
     }
 }

사고방식: 시뮬레이션 문제, 쉬운TLE를 사용했습니다. 저는 빠른 읽기, 에이치 체질, 그리고 아래 조건에 부합되지 않는 수를 모두 건너뛰었기 때문에 시간이 반으로 줄었고 500여 ms만 필요합니다.
  • 만약에 한 수가 질수라면 2를 제외하고는 그는 틀림없이 홀수이기 때문에 회문의 질수는 반드시 홀수이다.
  • 모든 짝수 자리의 회문수는 11을 제외하고는 모두 질수가 아니기 때문에 회문질수는 반드시 홀수 자리이다.모든 짝수 자리의 회문수는 11의 배수이기 때문에 11을 제외하고는 모두 질수가 아니다
  • 코드는 다음과 같습니다.
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std; 
    const int N=9999999;
    int prime[N];
    inline int read(){	//     
        char c=getchar();int num=0;
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar())
            num=num*10+c-'0';
        return num;
    }
    bool digit(int x){	//           11     
    	if((x>=1000&&x<=9999)||(x>=100000&&x<=999999))
    		return 0;
    	if(x>=10&&x<=99&&x!=11)
    		return 0;
    	return 1;
    }
    bool huiwen(int x){	//         
    	int y=x,num=0;
    	while(y)
    	{
    		num=num*10+y%10;
    		y/=10;
    	}
    	if(num==x)
    		return 1;
    	else
    		return 0; 
    }
    int main(){
    	for(int i=0;i<=N;i++)	//   ,        1,     0 
    		prime[i]=1;
    	prime[0]=prime[1]=0;
    	for(int i=2;i<=N;i++){
    		if(!prime[i])
    			continue;
    		for(int j=i*2;j<=N;j+=i)
    			prime[j]=0;
    	}
    	int a,b;
    	a=read(),b=read();
    	if(a%2==0)	//        
    		a++;
    	b=min(9999999,b);	//             9999999 
    	for(int i=a;i<=b;i+=2){	//         
    		if(!digit(i))	//            
    			continue;
    		if(!huiwen(i))	//          
    			continue;
    		if(!prime[i])	//         
    			continue;
    		printf("%d
    "
    ,i); // } return 0; }

    좋은 웹페이지 즐겨찾기