LightOJ1197

题目链接:https://vjudge.net/problem/LightOJ-1197

题目大意:

  给你 a 和 b (1 ≤ a ≤ b < 231, b - a ≤ 100000),求出 [a,b] 中所有质数的个数。

解题思路:

  要找出 [a,b] 中的所有素数,只需要知道 [0,sort(b)] 中的所有素数(在本题中这一部分我们可以打出 [0,1e5] 的素数表),然后用类似素数筛的方法,筛掉 [a,b] 中的所有合数,剩下的就是素数。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e5+3;
 9 bool be_prim[maxn],temp[maxn];
10 ll prim[maxn],cnt;
11 void init(){
12     memset(be_prim,true,sizeof(be_prim));
13     be_prim[0]=be_prim[1]=false;
14     cnt=0;
15     for(ll i=2;i<(ll)maxn;i++){
16         if(be_prim[i]){
17             prim[cnt++]=i;
18             for(ll j=i*i;j<(ll)maxn;j+=i)  be_prim[j]=false;
19         }
20     }
21 }
22 
23 int main(){
24     init();
25     int T;
26     ll a,b;
27     scanf("%d",&T);
28     for(int t=1;t<=T;t++){
29         scanf("%lld%lld",&a,&b);
30         if(b<2){
31             printf("Case %d: 0\n",t);
32             continue;
33         }
34         if(a<2) a++;
35         memset(temp,true,sizeof(temp));
36         ll ans=b-a+1;
37         for(ll i=0;i<cnt&&prim[i]*prim[i]<=b;i++){
38             ll st=max(2LL,((a-1)/prim[i]+1))*prim[i];
39             while(st<=b){
40                 if(temp[st-a])  ans--,temp[st-a]=false;
41                 st+=prim[i];
42             }
43         }
44         printf("Case %d: %lld\n",t,ans);
45     }
46     return 0;
47 }

 

  

posted @ 2017-11-03 18:01  Blogggggg  阅读(190)  评论(0编辑  收藏  举报