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
",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
",t,ans);
45     }
46     return 0;
47 }

  

“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
原文地址:https://www.cnblogs.com/Blogggggg/p/7779462.html