hdu 4548 初始化+二分 *
题意:小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。给定一个区间,你能计算出这个区间内有多少个美素数吗?
链接:点我
先找出所有美素数,然后二分找位置,我这里直接用stl了,位置相减即可,注意区间端点的判断
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 #define pb(a) push_back(a) 11 const int INF=0x3f3f3f3f; 12 const double eps=1e-5; 13 typedef long long ll; 14 #define cl(a) memset(a,0,sizeof(a)) 15 #define ts printf("*****\n"); 16 const int MAXN=1000013; 17 int a[50000]; 18 int n,m,tt,cnt; 19 bool notprime[MAXN];//值为false表示素数,值为true表示非素数 20 void init() 21 { 22 memset(notprime,false,sizeof(notprime)); 23 notprime[0]=notprime[1]=true; 24 for(int i=2;i<MAXN;i++) 25 if(!notprime[i]) 26 { 27 if(i>MAXN/i)continue;//防止后面i*i溢出(或者i,j用long long) 28 //直接从i*i开始就可以,小于i倍的已经筛选过了,注意是j+=i 29 for(int j=i*i;j<MAXN;j+=i) 30 notprime[j]=true; 31 } 32 } 33 bool fun(int x) 34 { 35 int w=x; 36 int sum=0; 37 while(w) 38 { 39 sum+=(w%10); 40 w/=10; 41 } 42 if(!notprime[x]&&!notprime[sum]) return 1; 43 else return 0; 44 } 45 int main() 46 { 47 int i,j,k; 48 #ifndef ONLINE_JUDGE 49 freopen("1.in","r",stdin); 50 #endif 51 a[0]=2; 52 int tot=1; 53 init(); 54 for(i=3;i<=1000011;i++) 55 { 56 if(fun(i)) 57 { 58 a[tot++]=i; 59 } 60 } 61 int tt; 62 scanf("%d",&tt); 63 int ca=0; 64 while(tt--) 65 { 66 ca++; 67 int aa,bb; 68 scanf("%d%d",&aa,&bb); 69 if(aa==bb) 70 { 71 if(fun(aa)) 72 { 73 printf("Case #%d: 1\n",ca); 74 } 75 else 76 { 77 printf("Case #%d: 0\n",ca); 78 } 79 continue; 80 } 81 int pos1,pos2; 82 int f1=fun(aa); 83 int f2=fun(bb); 84 pos1=lower_bound(a,a+30123,bb)-a; 85 pos2=lower_bound(a,a+30123,aa)-a; 86 //printf("%d %d\n",pos1,pos2); 87 int q; 88 if((f1==0&&f2==1)||(f1==1&&f2==1)) 89 { 90 q=1; 91 } 92 else q=0; 93 printf("Case #%d: %d\n",ca,pos1-pos2+q); 94 } 95 }