HDU 4548 美素数 (素数筛法)
2018-03-23 14:54
337 查看
description
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
Output
对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。每组数据占一行,具体输出格式参见样例。
Sample Input
31 100
2 2
3 19
Sample Output
Case #1: 14Case #2: 1
Case #3: 4
solution
常规的素数筛法会超时,用一个数组存取当前数字前面的美素数个数,查表即可#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1000010; int prime[maxn]; int bp[maxn]; int sum_is_prime(int n) { int num_sum = 0; while (n > 0) { num_sum += (n % 10); n /= 10; } if (prime[num_sum]) return 1; return 0; } int main() { freopen("in.txt", "r", stdin); for (int i = 2; i < maxn; i++) prime[i] = 1; for (int i = 2; i < maxn; i++) if (prime[i] == 1) for (int j = i + i; j < maxn; j += i) prime[j] = 0; memset(bp, 0, sizeof(bp)); bp[1] = 0; int num = 0; for (int i = 2; i < maxn; i++) { if (prime[i] && sum_is_prime(i)) bp[i] = ++num; else bp[i] = num; } int T, case_ = 0; scanf("%d", &T); while (T--) { int L, R, cnt = 0; scanf("%d%d", &L, &R); printf("Case #%d: %d\n", ++case_, bp[R] - bp[L - 1]); } return 0; }
相关文章推荐
- HDU 4548 美素数 // 素数筛法
- hdu 4548(素数打表)
- 美素数 HDU 4548 TLE! = =|| 打表是一种态度。。。
- HDU 4548 美素数(西山居挑战赛)
- 美素数 【hdu-4548】【素数】
- HDU 4548 美素数(打表呀,有个小技巧)
- 美素数(hdu 4548)
- 2013金山西山居创意游戏程序挑战赛——初赛(2) A 美素数(hdu 4548)
- hdu 4548 素数打表
- HDU 4548 美素数【素数打表】
- HDU 4548 美素数
- HDU 4548 素数打表 + 线段树
- HDU 4548 美素数 素数题解
- HDU 4548 美素数
- HDU 4548.美素数 解题心得
- HDU 4548 美素数
- HDU 4548.美素数【打表】【预处理】【8月11】
- hdu 4548 美素数(筛选法求素数)
- 【hdu 4548】美素数
- HDU-4548-美素数【打表】