CF:358C 暴力DP筛选素数预处理
2014-03-26 19:26
302 查看
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.
这题太神了!比赛的时候不知道怎么做,唉……没想到可以这样暴力的。太神了……递推的DP,查询时间复杂为O(1),比线段树还快,这个能这样暴力真是服了,见识短浅啊……
dp[i]表示当前2到 i 这中间能被 那n 个数整除的数之和……然后求 l 到 r 的时候就可以直接dp [ r ] - dp [ l-1] 了。
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.
这题太神了!比赛的时候不知道怎么做,唉……没想到可以这样暴力的。太神了……递推的DP,查询时间复杂为O(1),比线段树还快,这个能这样暴力真是服了,见识短浅啊……
dp[i]表示当前2到 i 这中间能被 那n 个数整除的数之和……然后求 l 到 r 的时候就可以直接dp [ r ] - dp [ l-1] 了。
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <list> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define pri(a) printf("%d\n",a) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define MM 10000005 #define MN 3005 #define INF 10000007 #define eps 1e-7 using namespace std; typedef long long ll; int vis[MM],dp[MM],is[MM]; void getprime() { int i,j; for(i=2;i<=MM;i++) if(!is[i]) { if(vis[i]) dp[i]+=vis[i]; for(j=i+i;j<=MM;j+=i) { if(vis[j]) dp[i]+=vis[j]; is[j]=1; } } for(i=2;i<=MM;i++) dp[i]+=dp[i-1]; } int main() { int n,m,i,a,l,r; sca(n); for(i=0;i<n;i++) sca(a),vis[a]++; getprime(); sca(m); while(m--) { scanf("%d%d",&l,&r); l=l>MM?MM:l; r=r>MM?MM:r; pri(dp[r]-dp[l-1]); } return 0; }
相关文章推荐
- 指向学生类的指针
- 林志玲“情沪魅影”时装片展情缘-中新网
- [物理学与PDEs]第1章第5节 Maxwell 方程组的数学结构, 电磁场的波动性 5.3 电磁场的波动性, 自由电磁波
- 如何查看ORACLE的隐含参数
- ZOJ 1992 Sightseeing Tour
- 难得有情人》走红的关淑怡曝私生子生父是不丹活佛
- 强引用、弱引用、软引用、幽灵引用区别
- Effective Java 32 Use EnumSet instead of bit fields
- 学习:练习题。
- POJ-2456 Aggressive cows
- Dev GridControl 小结
- Dev GridControl 小结
- c语言向文件中写入
- Java static块
- 杨辉三角
- 对象数组操作长方柱类
- fork
- play framework (一)
- Copy List with Random Pointer
- 堆算法C实现