用线性筛法筛选出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;
}
View Code

相关文章: