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 }

 

posted @ 2019-04-28 01:52  Fi  阅读(426)  评论(0编辑  收藏  举报