用线性筛法筛选出10^6的素数,然后预处理统计下.. O(1)就能得到结果了.
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int N = (int)1e6+10; bool vis[N]; int p[N], sum[N]; void GetPrime(){ memset(vis,0,sizeof(0)); vis[1] = 1; int cnt = 0; for(int i = 2; i < N; i++){ if( !vis[i] ) p[cnt++] = i; for(int j = 0; (j<cnt)&&(p[j]*i<N); j++){ vis[ p[j]*i ] = 1; if( i%p[j] == 0 )break; } } } int Dight(int x){ int s = 0; while(x) s+=x%10, x /= 10; return s; } void init(){ GetPrime(); sum[0] = sum[1] = 0; for(int i = 2; i < N; i++){ sum[i] = sum[i-1]; if( !vis[i] && !vis[ Dight(i) ] ) sum[i]++; } } int main(){ init(); int T; scanf("%d", &T); for(int Case = 1; Case <= T; Case++ ){ int a, b; scanf("%d%d", &a,&b); printf("Case #%d: %d\n", Case, sum[b] - sum[a-1] ); } return 0; }