题意:
一直H-number是4*n+1,n是非负整数。
prime H-number是在H-number域里面不能分解的H-number。
semi-prime H-number是在H-number域里面只能分解成两个prime H-number的H-number。
给出一个H-number N,问在1~N(包含两端)有多少个semi-prime H-number。(1 <= N <= 1,000,001)。
思路:
筛法,递推。
#include <cstdio>
#define N 250000
int a[N+5] = {0};
void calc()
{
a[0] = 1;
for (int i = 1; i <= N; ++ i)
{
if (a[i] == 0) a[i] = 1;
for (int j = 1; j <= i && 4*i*j+i+j <= N; ++ j)
a[4*i*j+i+j] = a[i] + a[j];
}
}
void func()
{
a[0] = 0;
for (int i = 1; i <= N; ++ i)
a[i] = (a[i]==2?1:0) + a[i-1];
}
int n;
int main()
{
calc();
func();
while (scanf("%d", &n), n)
printf("%d %d\n", n, a[n>>2]);
}