题目:
http://poj.org/problem?id=3292
思路:
水水的题,无耻得写篇题解记录。=。=
CODE:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1000005;
int pri[maxn], num[maxn], ans[maxn];
void no_Hprime()
{
fill(pri, pri+maxn, 1);
int k = 0;
for(int i = 5; i < maxn; i+=4) {
if(pri[i]) {
num[k++] = i;
}
for(int j = 0; j < k; ++j) {
if(num[j] * i > maxn) break;
pri[num[j]*i] = 0;
}
}
}
int H_semiprime()
{
int k = 0;
for(int i = 21; i < maxn; i += 4) {
for(int j = 5; j *j <= i; j+=4) {
if(i % j == 0 && pri[j] && pri[i/j]) {
ans[k++] = i;
break;
}
}
}
return k;
}
int main()
{
int n;
no_Hprime();
int k = H_semiprime();
while(~scanf("%d", &n), n) {
int it = upper_bound(ans, ans + k, n) - ans;
printf("%d %d\n", n, it);
}
return 0;
}