题意:H数:4*n+1 (n = 0,1,2……)
H素数:不是1,也不能写成两个不是1的H数的乘积
H-半素数:能写成两个H素数的乘积
给定一个H数h(h <= 1000001),输出1~h内的H-半素数个数
先求出所有的H素数,与筛选素数打表类似。然后对于每个h,暴力统计个数即可。
1 #include<cstdio> 2 #include<cstring> 3 #include<cctype> 4 #include<cstdlib> 5 #include<cmath> 6 #include<iostream> 7 #include<sstream> 8 #include<iterator> 9 #include<algorithm> 10 #include<string> 11 #include<vector> 12 #include<set> 13 #include<map> 14 #include<deque> 15 #include<queue> 16 #include<stack> 17 #include<list> 18 typedef long long ll; 19 typedef unsigned long long llu; 20 const int MAXN = 250000 + 10; 21 const int MAXT = 1000000 + 10; 22 const int INF = 0x7f7f7f7f; 23 const double pi = acos(-1.0); 24 const double EPS = 1e-6; 25 using namespace std; 26 27 char vis[MAXT]; 28 vector<int> h, a; 29 int n, m; 30 31 void init(){ 32 memset(vis, 0, sizeof vis); 33 for(ll i = 5; i < MAXT; i += 4){ 34 if(vis[i]) continue; 35 h.push_back(i); 36 for(ll j = i; j < MAXT; j += i) vis[j] = 1; 37 } 38 m = h.size(); 39 } 40 41 int solve(){ 42 memset(vis, 0, sizeof vis); 43 int ans = 0; 44 for(int i = 0; i < m; ++i) 45 for(int j = 0; j < m; ++j){ 46 int tmp = h[i] * h[j]; 47 if(tmp > n) break; 48 if(vis[tmp]) continue; 49 ++ans; 50 vis[tmp] = 1; 51 } 52 return ans; 53 } 54 55 int main(){ 56 init(); 57 while(scanf("%d", &n) == 1 && n) 58 printf("%d %d\n", n, solve()); 59 return 0; 60 }