[UVA10533]Digit Primes

  本题数字本身是素数,并且各数位和也是素数,这样的数字在某区间内的个数。

  先素数筛,再筛出各数位和是奇数的数,接着统计1-a的时候所有符合条件的数字的个数,求特定区间符合条件的数字做差即可。

  代码如下:

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 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(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 }

 

转载于:https://www.cnblogs.com/kirai/p/4740789.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值