题意:
定义一种数叫H-numbers,它是所有能除以四余一的数。
H-numbers分三种:
1、H-primes(素),这种数只能被1和它本身整除,不能被其他的H-number整除
2、H-semi-primes(半素)是由两个H-primes相乘得出的
3、剩下的是H-composite(合数)
问给一个数,求1到这个数之间有多少个H-semi-primes
注意不要把合数算进去了。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
typedef long long int li;
using namespace std;
int v[1000100];
int a[1000000] = {5,9,13,17,21};
int cnt = 5;
int num = 1;
bool jud(int n){
int lim = sqrt(n) + 1;
for(int i = 0;a[i] < lim;i++){
if(n % a[i] == 0){
if(v[n/a[i]] == -1){
v[n] = 2;
return false;
}
else{
v[n] = 0;
return false;
}
}
}
v[n] = -1;
return true;
}
int ans[1000010];
int main(){
memset(v,-1,sizeof(v));
//freopen("1.txt","w",stdout);
v[1] = v[5] = v[9] = v[13] = v[17] = v[21] = -1;
for(int i = 25;i < 1001000;i += 4){
if(jud(i))
a[cnt++] = i;
}
for(int i = 1;i < 1001000;i++){
if(v[i] == 2){
ans[i] = ans[i-1] + 1;
}
else
ans[i] = ans[i-1];
}
int n;
int res;
while(scanf("%d",&n),n){
res = ans[n];
printf("%d %d\n",n,res);
}
}