题意是:形如 4 * n + 1的数称为H数, H素数就是不能写成两个不为1的H数的乘积, H半素数是两个不为1的H素数的乘积。
H数和H素数类似于自然数和自然数的素数, 对H数用筛法把H素数筛出来, 然后再把H半素数求出来, 打表即可。
#include <cstdio>
const int maxv = 1001000;
int H[maxv], res[maxv];
void H_primes() {
H[1] = -1;
for(int i = 1; (i * 4 + 1) < maxv; i++)
if(!H[i * 4 + 1]) {
H[i * 4 + 1] = 1;
for(int j = i; (j * 4 + 1) < maxv / (i * 4 + 1); j++) {
H[(j * 4 + 1) * (i * 4 + 1)] = -1;
}
}
for(int i = 1; (i * 4 + 1) < maxv; i++)
if(H[i * 4 + 1] == 1) {
for(int j = i; (j * 4 + 1) < maxv / (i * 4 + 1); j++)
if(H[j * 4 + 1] == 1)
H[(j * 4 + 1) * (i * 4 + 1)] = 2;
}
}
void H_cnt() {
int cnt = 0;
for(int i = 1; (i * 4 + 1) < maxv; i++) {
if(H[i * 4 + 1] == 2)
cnt++;
res[i * 4 + 1] = cnt;
}
}
int main() {
H_primes();
H_cnt();
int n;
while(~scanf("%d", &n)&& n) {
printf("%d %d\n", n, res[n]);
}
return 0;
}