-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathuva-10533.cpp
More file actions
112 lines (86 loc) · 2.13 KB
/
uva-10533.cpp
File metadata and controls
112 lines (86 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include <bits/stdc++.h>
using namespace std;
const int MAXSIZE = 1000001;
vector<int> sumPrime(MAXSIZE, 0);
int upperBound(int value);
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
vector<bool> prime;
int test, t1, t2, i, j, digit, n, sum, limit, _count;
for (i = 2; i < MAXSIZE; i++) {
bool v = true;
prime.push_back(v);
sumPrime[i] = MAXSIZE;
}
prime[0] = prime[1] = false;
sumPrime[0] = sumPrime[1] = MAXSIZE;
limit = sqrt(MAXSIZE);
for (i = 2; i <= limit; i++) {
if (prime[i] == true) {
sum = 2 * i;
while (sum <= MAXSIZE - 1) {
prime[sum] = false;
sum += i;
}
}
}
for (i = 2; i < MAXSIZE; i++) {
if (prime[i] == true) {
n = i;
sum = 0;
do {
digit = n % 10;
sum += digit;
n /= 10;
} while (n != 0);
if (prime[sum] == true) {
sumPrime[i] = i;
}
}
}
/*for (i = 0; i < MAXSIZE - 1; i++) {
for (j = i + 1; j < MAXSIZE; j++) {
if (sumPrime[i] > sumPrime[j]) {
digit = sumPrime[i];
sumPrime[i] = sumPrime[j];
sumPrime[j] = digit;
}
}
}*/
sort(sumPrime.begin(), sumPrime.end());
scanf("%d", &test);
while (test--) {
scanf("%d%d", &t1, &t2);
_count = upperBound(t2) - upperBound(t1 - 1);
printf("%d\n", _count);
}
return 0;
}
int upperBound(int value)
{
int begI, midI, endI;
//int SIZE = 30125
begI = 0;
endI = 30124;
midI = (begI + endI) / 2;
while (begI != endI - 1) {
if (value < sumPrime[0]) {
midI = -1;
break;
}
else if (value >= sumPrime[30124]) {
midI = 30124;
break;
}
if (sumPrime[midI] <= value) {
begI = midI;
}
else {
endI = midI;
}
midI = (begI + endI) / 2;
}
return (midI + 1);
}