Codeforces385CBearandPrimeNumbers


版权声明:本文为CSDN博主「Bjut_Search2016」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nyist_zxp/article/details/40020349

题目链接~~>

做题感悟:这题属于想法题,比赛时直接做的 D 题,但是处理坐标处理的头晕眼花的,结果到最后也没AC。

解题思路:

因为查询的时候只考虑素数,so~我们只考虑素数就可以,这就需要筛素数,我们可以在筛素数的同时把某个素数出现的倍数加上,输入的时候只要记录某个数的个数就可以了。

代码:

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
#include<iostream>
#include<sstream>
#include<map>
#include<cmath>
#include<fstream>
#include<queue>
#include<vector>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<bitset>
#include<ctime>
#include<string>
#include<iomanip>
#include<algorithm>
using namespace std ;
#define INT long long int
const int INF = 0x3f3f3f ;
const double esp = 0.0000000001 ;
const double PI = acos(-1.0) ;
const int mod = 1000000007 ;
const int MY = 100 + 5 ;
const int MX = 10000000 + 5 ;
int Max ,n ,m ;
bool isprime[MX] ;
int sum[MX] ,num[MX] ;
void init() // 筛法同时记录个数
{
memset(isprime ,false ,sizeof(isprime)) ;
memset(sum ,0 ,sizeof(sum)) ;
for(int i = 2 ;i <= Max ; ++i)
{
sum[i] += sum[i-1] ;
if(!isprime[i])
{
sum[i] += num[i] ;
for(int j = i + i ;j <= Max ; j += i)
{
sum[i] += num[j] ;
isprime[j] = true ;
}
}
}
}
int main()
{
int x ;
while(~scanf("%d" ,&n))
{
memset(num ,0 ,sizeof(num)) ;
Max = 0 ;
for(int i = 0 ;i < n ; ++i)
{
scanf("%d" ,&x) ;
num[x]++ ; // 记录个数
Max = max(Max ,x) ;
}
init() ;
scanf("%d" ,&m) ;
int le ,rt ;
for(int i = 0 ;i < m ; ++i)
{
scanf("%d%d" ,&le ,&rt) ;
if(rt > Max) rt = Max ;
if(le > Max) cout<<"0"<<endl ;
else cout<<sum[rt]-sum[le-1]<<endl ;
}
}
return 0 ;
}
-------- 本文结束 感谢阅读 --------

本文标题:Codeforces385CBearandPrimeNumbers

文章作者:FunctFan

发布时间:2020年06月19日 - 03:23:13

最后更新:2020年06月23日 - 22:22:52

原始链接:https://functfan.github.io/posts/1795814039/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。