本题数字本身是素数,并且各数位和也是素数,这样的数字在某区间内的个数。
先素数筛,再筛出各数位和是奇数的数,接着统计1-a的时候所有符合条件的数字的个数,求特定区间符合条件的数字做差即可。
代码如下:
1 #include
2 #include
3 #include
4 #include
5
6 using namespace std;
7
8 const int maxn = 1000010;
9 bool prime【maxn】;
10 int satis【maxn】;
11 int a, b;
12
13 void printlist() {
14 memset(prime, true, sizeof(prime));
15 prime【0】 = prime【1】 = false;
16 int pedge = int(sqrt(maxn));
17 for(int i = 2; i <= pedge; i++) {
18 if(//代码效果参考:http://www.zidongmutanji.com/zsjx/346165.html
prime【i】) {19 int o = maxn / i;
20 for(int j = 2; j <= o; j++) {
21 prime【i*j】 = false;
22 }
23 }
24 }
25 }
26
27 bool judge(int x) {
28 int ans = 0;
29 while(x) {
30 ans += x % 10;
31 x /= 10;
32 }
33 return prime【ans】;
34 }
35
36 void init() {
37 printlist();
38 memset(satis, 0, sizeof(satis));
39 for(int i = 2; i <= maxn; i++) {
40 if(judge(i) prime【i】) {
41 satis【i】 = 1;
42 }
43 }
44 for(int i = 2; i <= maxn; i++) {
45 satis【i】 += satis【i-1】;
46 }
47 }
48
49 int main() {
50 init();
51 int T;
52 scanf("%d", T);
53 while(T--) {
54 scanf("%d %d", a, b);
55 cout [ satis【b】 [ " " [ satis【a-1】 [ endl;
56 printf("%d\n",satis【b】-satis【a-1】);
57 }
58 return 0;
59 }