题目链接:http://poj.org/problem?id=3292
题目大意:H数即5,9,13,17,21.......4*n+1;若一个H数可以分解为两个H数相乘则H数为H合数,否则称为H质数,若一个H数可以分解为两个H质数的成绩则称之为Semi-prime H.求在给定的书n,在[1,n]里面有多少个Semi-prime H。
解题思路:水题一个直接上代码,用到了类似求10^6以内所有质数的方法。
#include <cstdio>
const int MAXNUM = 1000001;
int Hprime[MAXNUM];
int count[MAXNUM];
int main()
{
int i, j;
//标记出所有的H质数,若不是则标记为它的最小H约数
for (i = 1; i <= MAXNUM; i += 4)
{
Hprime[i] = 1;
for (j = 5; j * j <= i; j += 4)
{
if (i % j == 0)
{
Hprime[i] = j;
break;
}
}
}
count[1] = 0;
for (i = 5; i <= MAXNUM; i += 4)
{
count[i] = count[i - 4];
if (Hprime[i] != 1 && Hprime[i/Hprime[i]] == 1)
count[i] += 1;
}
int k;
while (scanf ("%d", &k), k)
{
printf ("%d %d\n", k, count[k]);
}
return 0;
}