本题数字本身是素数,并且各数位和也是素数,这样的数字在某区间内的个数。
先素数筛,再筛出各数位和是奇数的数,接着统计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 ",satis[b]-satis[a-1]); 57 } 58 return 0; 59 }