题目链接: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 }