long long 大数 100000内的区间内筛素数个数
题目大意:见标题
思路: 先欧筛素数(1000000内) 埃筛思路区间排除
1 #include<bits/stdc++.h> 2 using namespace std; 3 int p[1000500],c[1500500]; 4 int fd[200005]; 5 int fe[1500500]; 6 const int Max=1500000; 7 int num=1; 8 void io() { 9 10 memset(c,0,sizeof(c)); 11 for(int i=2; i<Max; i++) { 12 if(!c[i]) 13 p[num++]=i; 14 for(int j=1; j<num&&i*p[j]<=Max; j++) { 15 c[i*p[j]]=1; 16 if(i%p[j]==0) 17 break; 18 } 19 } 20 } 21 long long maxe(long long a,long long b) { 22 if(a>b) 23 return a; 24 else 25 return b; 26 } 27 int main() { 28 io(); 29 30 int T; 31 scanf("%d",&T); 32 int e=T; 33 while(T--) { 34 long long a,b; 35 int numm=0; 36 scanf("%lld%lld",&a,&b); 37 38 memset(fe,0,sizeof(fe)); 39 for(int i=1; i<num&&p[i]*p[i]<=b; i++) { 40 long long int x=a/p[i],y=b/p[i]+1; 41 for(int j=x; j<=y; j++) { 42 fe[maxe(0,j*p[i]-a+1)]=1; 43 // cout<<min(maxe(0,j*p[i]-a),b-a+2)<<endl; 44 } 45 } 46 for(int i=1; i<=num; i++) { 47 fe[maxe(p[i]-a+1,0)]=0; 48 } 49 if(a==1) 50 fe[1]=1; 51 for(int i=1; i<=b-a+1; i++) { 52 if(fe[i]==0) 53 numm++; 54 // cout<<" "<<fe[i]; 55 } 56 57 58 59 60 cout<<"Case "<<e-T<<": "<<numm<<endl; 61 } 62 63 }