http://poj.org/problem?id=3292
筛选法:p【i】 == 0表明4i+1为h-prime, p【i】 == 1表明4i+1为非h-semi-prime的h-composites,
p【i】 == 2表明4i+1为h-semi-prime
如何筛选看代码
#include <iostream>
#include <cstring>
using namespace std;
#define MAXN 250005
int p[MAXN], sum[MAXN];
void init()
{
int i, j;
memset(p, 0, sizeof (p));
memset(sum, 0, sizeof (sum));
//(i<<2)+1 == 4*i+1
for (i = 1; i <= 251; i++) {
for (j = i; ; j++) {
int tmp = ((i << 2) + 1) * ((j << 2) + 1); //tmp为两个h-number的乘积
if (tmp > 1000001) break;
tmp = (tmp - 1) >> 2;
if (p[i] || p[j]) p[tmp] = 1;
else if (!p[i] && !p[j] && !p[tmp]) p[tmp] = 2;
}
}
for (i = 1; i < MAXN; i++) //sum[i]存储前i个数中h-semi-prime的个数。
if (p[i] == 2)
sum[i] = sum[i-1] + 1;
else sum[i] = sum[i-1];
}
int main()
{
int n;
init();
while (cin >> n && n) {
cout << n << " " << sum[(n-1)>>2] << endl;
}
return 0;
}