您的位置:首页 > 其它

CodeForces 385C Bear and Prime Numbers

2016-07-12 10:00 453 查看
C. Bear and Prime Numbers

time limit per test
2 seconds

memory limit per test
512 megabytes

input
standard input

output
standard output

Recently, the bear started studying data structures and faced the following problem.

You are given a sequence of integers x1, x2, ..., xn
of length n and m queries, each of them is characterized by two integers
li, ri. Let's introduce
f(p) to represent the number of such indexes
k, that xk is divisible by
p. The answer to the query
li, ri is the sum:


, where
S(li, ri) is a set of prime numbers from segment
[li, ri] (both borders are included in the segment).

Help the bear cope with the problem.

Input
The first line contains integer n
(1 ≤ n ≤ 106). The second line contains
n integers x1, x2, ..., xn
(2 ≤ xi ≤ 107). The numbers are not necessarily distinct.

The third line contains integer m
(1 ≤ m ≤ 50000). Each of the following m lines contains a pair of space-separated integers,
li and
ri
(2 ≤ li ≤ ri ≤ 2·109)
— the numbers that characterize the current query.

Output
Print m integers — the answers to the queries on the order the queries appear in the input.

Examples

Input
6
5 5 7 10 14 15
3
2 11
3 12
4 4


Output
9
7
0


Input
7
2 3 5 7 11 4 8
2
8 10
2 123


Output
0
7


Note
Consider the first sample. Overall, the first sample has 3 queries.

The first query l = 2,
r = 11 comes. You need to count f(2) + f(3) + f(5) + f(7) + f(11) = 2 + 1 + 4 + 2 + 0 = 9.

The second query comes l = 3,
r = 12. You need to count f(3) + f(5) + f(7) + f(11) = 1 + 4 + 2 + 0 = 7.

The third query comes l = 4,
r = 4. As this interval has no prime numbers, then the sum equals 0.

题意:给定n个数,然后询问一个区间内的所有素数能整出这n个数的个数的和。
思路:用埃氏筛法的思路,先预处理(1-m)这个区间内的答案。具体方法见代码。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e7;

bool is_prime[N + 1];
int x[N + 1];
int quest[N + 1];

void sieve() {   //预处理
for(int i = 2; i <= N; ++i) {
if(!is_prime[i]) {
for(int j = i; j <= N; j += i) {
quest[i] += x[j];
is_prime[j] = true;
}
}
}
for(int i = 1; i <= N; ++i) quest[i] += quest[i - 1];
}

int main()
{
int n, q, l, r, temp;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &temp);
x[temp]++;
}
sieve();
scanf("%d", &q);
for(int i = 1; i <= q; ++i) {
scanf("%d%d", &r, &l);
if(r >= N) r = N;
if(l >= N) l = N - 1;
printf("%d\n", quest[l] - quest[r - 1]);   //查询
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息