先筛出素数,再筛出美素数。
简单题。
/* 筛素数 */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> #include<stack> #include<math.h> #include<map> using namespace std; const int maxn = 1000005; int IsPrime[ maxn ],IsSpecialPrime[ maxn ]; int GetSum( int x ){ int ans = 0; while( x ){ ans += x%10; x/=10; } return ans; } void init_prime(){ for( int i=1;i<maxn;i+=2 ) IsPrime[i] = 1; for( int i=0;i<maxn;i+=2 ) IsPrime[i] = 0; IsPrime[1] = 0; IsPrime[2] = 1; for( int i=3;i<maxn;i++ ){ if( IsPrime[i]==1 ){ int t,delta; delta = i*2; t = delta+i; while( t<maxn ){ IsPrime[t] = 0; t += delta; } } } //for( int i=maxn-1;;i-- ){ //if( IsPrime[i]==1 ){ //printf("max=%d ",i); //break; //} //} //memset( IsSpecialPrime,0,sizeof(IsSpecialPrime) ); for( int i=0;i<maxn;i++ ){ if( IsPrime[i]==1&&IsPrime[GetSum(i)]==1 ){ IsSpecialPrime[i] = 1; } else{ IsSpecialPrime[i] = 0; } } for( int i=1;i<maxn;i++ ) IsSpecialPrime[ i ] += IsSpecialPrime[ i-1 ]; } int main(){ init_prime(); int ca; scanf("%d",&ca); int T = 1; while( ca-- ){ printf("Case #%d: ",T++); int L,R; scanf("%d%d",&L,&R); printf("%d ",IsSpecialPrime[R]-IsSpecialPrime[max(0,L-1)]); } return 0; }