洛谷P2667 超级质数 [2017年6月计划 数论05]
P2667 超级质数
题目背景
背景就是描述,描述就是背景。。。。。。
题目描述
一个质数如果从个位开始,依次去掉一位数字,两位数字,三位数字。。。。。。直到只剩一位数字中间所有剩下的数都是质数,则称该质数为一个超级质数。例如:2333是一个质数,因为2333,233,23,2都是质数,所以2333是一个四位超级素数。请你写一个程序,给定一个整数X,求大小小于X的超级质数。
输入输出格式
输入格式:一行,给出一个整数X(1<=X<=100000000).
输出格式:第一行,一个整数k,表示X以内超级质数的个数.
第2至k+1行,每行一个整数,输出所有X以内的超级质数,这些数按从小到大的顺序排列。
输入输出样例
输入样例#1:
100
输出样例#1:
13 2 3 5 7 23 29 31 37 53 59 71 73 79
说明
对于30%的数据,X<=1000。
对于100%的数据,X<=100000000。
最后一道数学水题了。
1 #include <bits/stdc++.h> 2 const int INF = 0x3f3f3f3f; 3 inline void read(long long &x) 4 { 5 x = 0;char ch = getchar();char c = ch; 6 while(ch < '0' || ch > '9')c = ch, ch = getchar(); 7 while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0',ch = getchar(); 8 if(c == '-')x = -x; 9 } 10 11 long long x; 12 13 long long a; 14 15 bool IsPrime(long long k) 16 { 17 long long a = sqrt(k); 18 for(int i = 2;i <= a;i ++) 19 { 20 if(k % i == 0) 21 { 22 return false; 23 } 24 } 25 return true; 26 } 27 28 long long prime[1000]; 29 30 long long num[10]; 31 int head,tail; 32 int main() 33 { 34 read(x); 35 if(x < 2){printf("0");return 0;} 36 if(x < 3){printf("1\n2");return 0;} 37 if(x < 5){printf("2\n2\n3");return 0;} 38 if(x < 7){printf("3\n2\n3\n5");return 0;} 39 if(x < 23){printf("4\n2\n3\n5\n7");return 0;} 40 head = 1; 41 tail = 4; 42 prime[1] = 2; 43 prime[2] = 3; 44 prime[3] = 5; 45 prime[4] = 7; 46 num[0] = 1; 47 num[1] = 3; 48 num[2] = 7; 49 num[3] = 9; 50 while(head <= tail) 51 { 52 for(int i = 0;i <= 3;i ++) 53 { 54 long long tmp = prime[head] * 10 + num[i]; 55 if(tmp <= x && IsPrime(tmp)) 56 { 57 prime[++tail] = tmp; 58 } 59 if(tmp > x)goto L1; 60 } 61 head ++; 62 } 63 L1: 64 printf("%d\n", tail); 65 for(int i = 1;i <= tail;i ++) 66 { 67 printf("%d\n", prime[i]); 68 } 69 return 0; 70 }