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