洛谷P2667 超级质数 [2017年6月计划 数论05]

Posted 嘒彼小星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷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 }

 

以上是关于洛谷P2667 超级质数 [2017年6月计划 数论05]的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1062 数列 [2017年6月计划 数论03]

洛谷P3459 [POI2007]MEG-Megalopolis [2017年6月计划 树上问题02]

洛谷P1978 集合 [2017年6月计划 数论08]

洛谷P1890 gcd区间 [2017年6月计划 数论09]

洛谷P1147 连续自然数和 [2017年6月计划 数论01]

洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]