超级素数

Posted hnoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超级素数相关的知识,希望对你有一定的参考价值。

超级素数

程序名:super.cpp super.in super.out

题目描述:

一个素数,依次从低位去掉一位,二位,……,若所得的各数仍都是素数,则称超级素数。

例如:7331是个4位超级素数,因为7737337331均为素数. 试求n位数的超级素数: (1)超级素数的个数 (2)所有超级素数之和 (3)最大的超级素数。  

 

输入描述:

输入一个整数n(n<=10)  

 

输出描述:

输出三个整数,分别为超级素数的个数,所有超级素数之和,最大的超级素数;  无解输出-1

 

样式输入:

4

 

样式输出:

16

68910

7393

 

刚看到数据规模约定:1010!!无论是埃拉托斯特尼筛法(O(NloglogN)),还是线性筛法(O(N)),都无法筛出那么多质数用来判断。

然后我很天真的 想把质数筛出来,粘贴到程序里。

然后就产生了几十万行代码:

 技术图片

 

蛤,无法编译。

 技术图片

 

再想,发现自己一直在避免试除法(O(sqrt(n))),原因就是它太疯狂了。最坏情况下,1010要试除105次,宽搜1、3、7、9四个数一共有九层,49大概是105不包括已经筛掉的合数肯定会超时。

 

那如果包括呢???

 

试一试就知道了。瞬间出答案。竟然如此简单!

 

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 long long data[100000], x;
 6 int d[5] = 0, 1, 3, 7, 9;
 7 int n, op=0, cl=4, start=1;
 8 int ans, sum;
 9 bool is_prime(int x)
10     for(int i=2; i*i<=x; i++)
11         if(x % i == 0) return 0;
12     return 1;
13 
14 int bit(long long x)
15     int ans = 0;
16     while(x)
17         x /= 10;
18         ans++;
19     
20     return ans;
21 
22 int main()
23     cin >> n;
24 //特判 
25     if(n > 9)
26         cout << -1 <<"\\n";
27         return 0;
28     
29     data[1] = 2;
30     data[2] = 3;
31     data[3] = 5;
32     data[4] = 7;
33     while(op < cl)
34         op++;
35         for(int i=1; i<=4; i++)
36             x = data[op] * 10 + d[i];
37             if(is_prime(x))
38                 cl++;
39                 data[cl] = x;
40             
41         
42     
43     
44 // find the start position
45     while(bit(data[start]) < n)
46         start++;
47 
48     while(bit(data[start]) == n)
49         ans++;
50         sum += data[start];
51         start++;
52     
53     
54     cout << ans <<"\\n"<< sum <<"\\n"<< data[start-1] <<"\\n";
55     return 0;
56 

 

以上是关于超级素数的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——递推之超级素数

超级素数幂

埃氏筛法与欧拉筛(超级详解)

刷题_牛客_超级素数幂

每日编程-20170310

这个代码片段有啥作用?