美素數
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 7548 Accepted Submission(s): 2661
Total Submission(s): 7548 Accepted Submission(s): 2661
Problem Description
小明對數的研究比較熱愛,一談到數,腦子裏就涌現出好多數的問題,今天,小明想考考你對素數的認識。
問題是這樣的:一個十進制數,如果是素數,而且它的各位數字和也是素數,則稱之爲“美素數”,如29,本身是素數,而且2+9 = 11也是素數,所以它是美素數。
給定一個區間,你能計算出這個區間內有多少個美素數嗎?
問題是這樣的:一個十進制數,如果是素數,而且它的各位數字和也是素數,則稱之爲“美素數”,如29,本身是素數,而且2+9 = 11也是素數,所以它是美素數。
給定一個區間,你能計算出這個區間內有多少個美素數嗎?
Input
第一行輸入一個正整數T,表示總共有T組數據(T <= 10000)。
接下來共T行,每行輸入兩個整數L,R(1<= L <= R <= 1000000),表示區間的左值和右值。
接下來共T行,每行輸入兩個整數L,R(1<= L <= R <= 1000000),表示區間的左值和右值。
Output
對於每組數據,先輸出Case數,然後輸出區間內美素數的個數(包括端點值L,R)。
每組數據佔一行,具體輸出格式參見樣例。
每組數據佔一行,具體輸出格式參見樣例。
Sample Input
3
1 100
2 2
3 19
Sample Output
Case #1: 14
Case #2: 1
Case #3: 4
Source
素數打表+前綴和
代碼:
#include<cstdio>
#include<cstring>
using namespace std;
const int M=1e6+1;
bool num[M];//素數打表
int ans[M];//前綴和,ans[i]表示從1到i 共有多少個美素數
void init_prime()
{
memset(num,1,sizeof(num));
num[1]=0;
for(int i=2;i<=M;i++)
{
if(num[i])
{
for(int j=2*i;j<=M;j+=i)
num[j]=0;
}
}
}
void init_ans()
{
memset(ans,0,sizeof(ans));
for(int i=2;i<=M;i++)
{
if(num[i])
{
int s=0;
int temp=i;
//s爲i各位數字和
while(temp>0)
{
s+=temp%10;
temp/=10;
}
if(num[s])
{
ans[i]=ans[i-1]+1;
}
else
{
ans[i]=ans[i-1];
}
}
else ans[i]=ans[i-1];
}
}
int main()
{
int n,Case=0;
init_prime();
init_ans();
scanf("%d",&n);
while(n--)
{
int L,R;
scanf("%d%d",&L,&R);
//ans[R]-ans[L-1]計算區間 L-R內美素數的個數
printf("Case #%d: %d\n",++Case,ans[R]-ans[L-1]);
}
return 0;
}