hdu 4548(素数打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4548

思路:打表什么的没有什么技巧性可言,最后二分的时候得小心返回位置!!!

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 using namespace std;

 5 bool mark[1000010];

 6 int num[1000010];

 7 int k;

 8 

 9 int Judge(int n){

10     int ans=0;

11     while(n){

12         ans+=n%10;

13         n/=10;

14     }

15     return ans;

16 }

17     

18 

19 void IsPrime(){

20     memset(mark,true,sizeof(mark));

21     mark[0]=mark[1]=false;

22     k=0;

23     for(int i=2;i*i<1000000;i++){

24         if(mark[i]){

25             for(int j=i*i;j<1000000;j+=i)

26                 mark[j]=false;

27         }

28     }

29     for(int i=2;i<=1000010;i++){

30         if(mark[i]&&mark[Judge(i)]){

31             num[++k]=i;

32         }

33     }

34 }

35 

36 int Binary_Search(int l,int h,int number){

37     while(l<=h){

38         int mid=(l+h)/2;

39         if(num[mid]==number)return mid;

40         else if(num[mid]>number)h=mid-1;

41         else l=mid+1;

42     }

43     return l;

44 }

45 

46     

47 int main(){

48     IsPrime();

49     int _case,n,m,t=1;

50     scanf("%d",&_case);

51     while(_case--){

52         scanf("%d%d",&n,&m);

53         int cnt=0;

54         int pos1=Binary_Search(1,k,n);

55         int pos2=Binary_Search(1,k,m);

56         pos1--;

57         if(num[pos2]==m)pos2++;

58         cnt=pos2-pos1-1;

59         printf("Case #%d: %d\n",t++,cnt);

60     }

61     return 0;

62 }

63         

64     
View Code

 

你可能感兴趣的:(HDU)