NOIP模拟题——素数密度
问题描述
给定区间[L,R](L<=R<=2147483647,R-L<=1000000),请计算区间中素数的个数。
输入数据
两个数L和R
输出数据
一行,区间中素数的个数。
样例输入
2 11
样例输出
5
L和R范围很大,但区间长度反而很小。
考虑平移区间,将L和R的下标缩小(L是0,L+1是1……)
筛法求素数
1 #include<cstdio>
2 #include<iostream>
3 #include<cstdlib>
4 #include<cmath>
5 using namespace std;
6 const long long maxn=1e6+7;
7 long long l,r;
8 long long vis[maxn],q[maxn],temp;
9 long long pd[maxn];
10 void init()
11 {
12 long long qwe=sqrt(r+0.5);
13 for(long long i=2;i<=qwe;i++)
14 {
15 if(vis[i]==true)continue;
16 if(vis[i]==false)
17 {
18 q[++temp]=i;
19 for(long long j=i;j*i<=qwe;j++)
20 vis[j*i]=true;
21 }
22 }
23 return ;
24 }
25 int main()
26 {
27 freopen("prime.in","r",stdin);
28 freopen("prime.out","w",stdout);
29 scanf("%I64d%I64d",&l,&r);
30 long long len=r-l+1;
31 init();
32 for(long long i=1;i<=temp;i++)
33 {
34 long long kk=l/q[i];kk*=q[i];
35 if(kk<=q[i])kk=2*q[i];
36 if(kk<l)kk+=q[i];
37 for(long long j=kk;j<=r;j+=q[i])
38 pd[j-l+1]=true;
39 }
40 long long ans=0;
41 for(int i=1;i<=len;i++)
42 if(pd[i]==false)ans++;
43 printf("%I64d",ans);
44 return 0;
45 }