UVA - 11105 - Semi-prime H-numbers(筛选法)

题意: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 }  

 

posted @ 2016-10-25 11:05  TianTengtt  阅读(134)  评论(0编辑  收藏  举报