Uva10533 - Digit Primes

4 篇文章 0 订阅

A prime number is a positive number, which is divisible by exactly two different integers. A digit prime is a prime number whose sum of digits is also prime. For example the prime number 41 is a digit prime because 4+1=5 and 5 is a prime number. 17 is not a digit prime because 1+7 = 8, and 8 is not a prime number. In this problem your job is to find out the number of digit primes within a certain range less than 1000000.

 

Input

First line of the input file contains a single integer N (0<N<=500000) that indicates the total number of inputs. Each of the next N lines contains two integers t1 and t2 (0<t1<=t2<1000000).

 

Output

For each line of input except the first line produce one line of output containing a single integer that indicates the number of digit primes betweent1 and t2 (inclusive).

Sample Input


 3

10 20

10 100

100 10000

Sample Output

1

10

576

#include <cstdio>
#include <cstring>

bool u[1000010];
int su[500010];
int uu[1000010];

bool ok(int x){
    int t = 0;
    while(x){
        t += x % 10;
        x /= 10;
    }
    return u[t];
} 

int main(){
    int i, j, k, n, num = 0;

    memset(u, true, sizeof(u));
	for(i = 2; i < 1000000; i++){
	    if(u[i]) su[num++] = i;
		for(j = 0; j < num; j++){
		    if( i * su[j] > 1000000)  break;
			u[ i*su[j] ] = false;
			if(i % su[j] == 0) break;
		}
	}

    memset(uu, 0, sizeof(uu));
    for(i = 2; i < 1000000; i++)
        if(u[i] && ok(i)) uu[i] = 1;
    for(i = 2; i < 1000000; i++)
        uu[i] += uu[i-1];
    scanf("%d", &k);
    while(k--){
         scanf("%d %d", &i, &j);
         printf("%d\n", uu[j] - uu[i-1]);
    }
    return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值