HDU 4548 美素数(素数筛+预处理)
题解:素数筛选一下,再预处理出数组ans[i]代表1–i的美素数个数。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
int prime[N];
void init1()
{
memset(prime,0,sizeof(prime));
prime[1] = 1;
for(int i = 2; i < N/2; i++)
{
if(prime[i] == 0)
{
for(int j = i+i; j < N; j+=i)
prime[j] = 1;
}
}
}
int ans[N];
void init2()
{
memset(ans,0,sizeof(ans));
for(int i = 1; i < N; i++)
{
if(!prime[i])
{
int x = i;
int sum = 0;
while(x)
{
sum += x%10;
x /= 10;
}
if(!prime[sum])
ans[i] = ans[i-1]+1;
else
ans[i] = ans[i-1];
}
else
ans[i] = ans[i-1];
}
}
int main()
{
init1();
init2();
int T,cas = 1;
scanf("%d",&T);
while(T--)
{
int l,r;
scanf("%d%d",&l,&r);
printf("Case #%d: %d\n",cas++,ans[r]-ans[l-1]);
}
return 0;
}