美素數
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4687 Accepted Submission(s): 1616
Problem Description
小明對數的研究比較熱愛,一談到數,腦子裏就涌現出好多數的問題,今天,小明想考考你對素數的認識。
問題是這樣的:一個十進制數,如果是素數,而且它的各位數字和也是素數,則稱之爲“美素數”,如29,本身是素數,而且2+9 = 11也是素數,所以它是美素數。
給定一個區間,你能計算出這個區間內有多少個美素數嗎?
Input
第一行輸入一個正整數T,表示總共有T組數據(T <= 10000)。
接下來共T行,每行輸入兩個整數L,R(1<= L <= R <= 1000000),表示區間的左值和右值。
Output
對於每組數據,先輸出Case數,然後輸出區間內美素數的個數(包括端點值L,R)。
每組數據佔一行,具體輸出格式參見樣例。
Sample Input
Sample Output
Case #1: 14
Case #2: 1
Case #3: 4
#include<cstdio>
#include<iostream>
#include<cmath>
#define MAXN 1000000+10
using namespace std;
bool use[MAXN]={0};
int a[MAXN]={0};
bool judege(int n)
{
int sum=0;
while(n)
{
sum+=n%10;
n/=10;
}
return !use[sum];
}
int lowbit(int i) //樹狀數組最巧妙之處:i&(-i)
{
return i&(-i);
}
void update(int i, int val) //更新函數
{
while(i <= MAXN)
{
a[i] += val;
i += lowbit(i);
}
}
int sum(int i) //求和函數
{
int sum = 0;
while(i > 0)
{
sum += a[i];
i -= lowbit(i);
}
return sum;
}
void init(){
//memset( tree, 0, sizeof(tree) );
//memset( use, 0, sizeof(use) );
use[1] = true;
for(int i = 2; i <MAXN; i++ ){
if(!use[i]){
if(judege(i)){
update( i, 1 );
}
for(int j=i+i; j < MAXN; j += i ){
use[j] = true;
}
}
}
}
int main()
{
init();
int T=0;
scanf("%d",&T);
//printf("1\n");
for(int k=1;k<=T;k++)
{
int l=0,r=0;
scanf("%d%d",&l,&r);
printf("Case #%d: ",k);
printf("%d\n",sum(r)-sum(l-1));
}
return 0;
}