Skip to content

Commit 061a082

Browse files
Add files via upload
1 parent b9dee4e commit 061a082

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <cstdio>
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
void precompute(vector <int> &is_prime, int N)
7+
{
8+
is_prime[0] = is_prime[1] = false;
9+
vector <int> primes;
10+
11+
for(int i = 2; i <= N; i++)
12+
{
13+
if(is_prime[i])
14+
primes.push_back(i);
15+
16+
for(int j = 0; j < primes.size() && i*primes[j] <= N; j++)
17+
{
18+
is_prime[i*primes[j]] = false;
19+
20+
if(i%primes[j] == 0) break;
21+
}
22+
}
23+
}
24+
25+
int main()
26+
{
27+
int no_of_elements;
28+
scanf("%d", &no_of_elements);
29+
30+
const int MAX_N = 1e7;
31+
vector <int> frequency(MAX_N + 1, 0);
32+
while(no_of_elements--)
33+
{
34+
int element;
35+
scanf("%d", &element);
36+
frequency[element]++;
37+
}
38+
39+
vector <int> is_prime(MAX_N + 1, true);
40+
precompute(is_prime, MAX_N);
41+
42+
vector <int> no_of_multiples(MAX_N + 1, 0);
43+
for(int i = 1; i <= MAX_N; i++)
44+
{
45+
if(!is_prime[i]) continue;
46+
47+
for(int multiple = i; multiple <= MAX_N; multiple += i)
48+
{
49+
no_of_multiples[i] += frequency[multiple];
50+
}
51+
}
52+
53+
vector <int> answer(MAX_N + 1, 0);
54+
for(int i = 1; i <= MAX_N; i++)
55+
answer[i] = answer[i - 1] + no_of_multiples[i];
56+
57+
int no_of_queries;
58+
scanf("%d", &no_of_queries);
59+
60+
while(no_of_queries--)
61+
{
62+
int left, right;
63+
scanf("%d %d", &left, &right);
64+
65+
right = min(right, MAX_N);
66+
left = min(left, MAX_N);
67+
68+
printf("%d\n", answer[right] - answer[left - 1]);
69+
}
70+
71+
return 0;
72+
}

0 commit comments

Comments
 (0)