CF C. Bear and Prime Numbers 筛选素数并计算
2014-03-22 12:55
260 查看
点击打开链接
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.
Sample test(s)
input
output
input
output
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.
素数快速打表,打表的同时求出每个数满足条件的总数。
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.
Sample test(s)
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.
素数快速打表,打表的同时求出每个数满足条件的总数。
//951 ms 88000 KB #include<stdio.h> #include<string.h> #define M 10000010 int b[M],count[M]; bool visit[M]; int num=0; void init_prim() { memset(visit,true,sizeof(visit)); for(int i=2; i<M;++i) { if(visit[i]==true) { if(b[i])count[i]+=b[i]; for(int j=i*2; j<M; j+=i) { count[i]+=b[j];//同时加上能够整除i的个数 visit[j]=false; } } } for(int i=2; i<M; i++) count[i]+=count[i-1]; } int main() { int n,q,l,r,s; init_prim(); while(scanf("%d",&n)!=EOF) { memset(b,0,sizeof(b)); for(int i=1; i<=n; i++) { scanf("%d",&s); b[s]++; } init_prim(); scanf("%d",&q); for(int cas=0; cas<q; cas++) { scanf("%d%d",&l,&r); if(l>M)l=M-1; if(r>M)r=M-1; printf("%d\n",count[r]-count[l-1]); } } return 0; }
相关文章推荐
- python使用筛选法计算小于给定数字的所有素数
- 素数计算---改良版埃氏筛选和欧拉筛选
- C/C++编程小练习 计算10亿之内的素数和(合数筛选算法实现)
- 快速线性筛选法求素数(质数)
- 并行计算实现判断一个数是不是素数--Win32和.Net两种方式结合
- 找出并打印101-200间的所有素数,计算总个数
- Java之用厄拉多塞筛选法求n以内的所有素数
- 素数的筛选找法
- 素数筛选法
- 筛选素数 进制转换
- 判断是否为素数 + 分解质因数(利用了Miller_Rabin和素数筛选法)
- hdu 4548 美素数(筛选法求素数)
- SQL 筛选掉某字段重复的数据以及计算查询到的数据
- [模板]素数筛选
- 筛选法求素数 关键词——置零
- Moscow Subregional 2010 Problem H. Hometask 转化、素数筛选
- 改进的筛选素数法..
- 【算法】普通方法和筛选法求素数
- 素数问题(计算2-100内的素数,以及判断一个数是否为素数)
- 用筛选法求100之内的素数。