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 }

 

posted @ 2016-11-17 15:10  deadshotz  阅读(400)  评论(0编辑  收藏  举报