POJ 3978

题意:求区间[a,b]内所含质数个数。

题解:筛一遍素数,二分查找。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 const int mr=100001;

 6 bool notp[mr];

 7 int pr[mr];

 8 int pn;

 9 void getpri()//筛素数

10 {

11     memset(notp,0,sizeof(notp));

12     for(int i=2; i<mr; i++)

13     {

14         if(!notp[i])

15         {

16             pr[pn++]=i;

17         }

18         for(int j=0; j<pn && i*pr[j]<mr; j++)

19         {

20             int k=i*pr[j];

21             notp[k]=1;

22             if(i%pr[j]==0)

23                 break;

24         }

25     }

26 }

27 int cac(int x)

28 {

29     if(x<2)

30         return 0;

31     int mid,ll=0,rr=pn-1,ans=0;

32     while(ll<=rr)

33     {

34         mid=(ll+rr)>>1;

35         if(pr[mid]>x)

36             rr=mid-1;

37         else

38             ll=mid+1,ans=mid;

39     }

40     return ans+1;

41 }

42 int main()

43 {

44     pn=0;

45     getpri();

46     int a,b;

47     while(scanf("%d%d",&a,&b),a!=-1||b!=-1)

48     {

49         printf("%d\n",cac(b)-cac(a-1));

50     }

51     return 0;

52 }

你可能感兴趣的:(poj)