题意:H数:4*n+1 (n = 0,1,2……)
H素数:不是1,也不能写成两个不是1的H数的乘积
H-半素数:能写成两个H素数的乘积
给定一个H数h(h <= 1000001),输出1~h内的H-半素数个数
先求出所有的H素数,与筛选素数打表类似。然后对于每个h,暴力统计个数即可。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<list>
typedef long long ll;
typedef unsigned long long llu;
const int MAXN = 250000 + 10;
const int MAXT = 1000000 + 10;
const int INF = 0x7f7f7f7f;
const double pi = acos(-1.0);
const double EPS = 1e-6;
using namespace std;
char vis[MAXT];
vector<int> h, a;
int n, m;
void init(){
memset(vis, 0, sizeof vis);
for(ll i = 5; i < MAXT; i += 4){
if(vis[i]) continue;
h.push_back(i);
for(ll j = i; j < MAXT; j += i) vis[j] = 1;
}
m = h.size();
}
int solve(){
memset(vis, 0, sizeof vis);
int ans = 0;
for(int i = 0; i < m; ++i)
for(int j = 0; j < m; ++j){
int tmp = h[i] * h[j];
if(tmp > n) break;
if(vis[tmp]) continue;
++ans;
vis[tmp] = 1;
}
return ans;
}
int main(){
init();
while(scanf("%d", &n) == 1 && n)
printf("%d %d\n", n, solve());
return 0;
}