您的位置:首页 > 其它

poj_3292 Semi-prime H-numbers(筛素数)

2016-11-30 11:04 330 查看
Semi-prime H-numbers
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 9076 Accepted: 4007
DescriptionThis problem is based on an exercise of David Hilbert, who pedagogically suggested that one study the theory of4n+1 numbers. Here, we do only a bit of that.An H-number is a positive number which is one more than a multiple of four: 1, 5, 9, 13, 17, 21,... are theH-numbers. For this problem we pretend that these are the only numbers. TheH-numbers are closed under multiplication.As with regular integers, we partition the H-numbers into units,H-primes, and H-composites. 1 is the only unit. AnH-number h is H-prime if it is not the unit, and is the product of twoH-numbers in only one way: 1 × h. The rest of the numbers areH-composite.For examples, the first few H-composites are: 5 × 5 = 25, 5 × 9 = 45, 5 × 13 = 65, 9 × 9 = 81, 5 × 17 = 85.Your task is to count the number of H-semi-primes. An H-semi-prime is an H-number which is the product of exactly twoH-primes. The two H-primes may be equal or different. In the example above, all five numbers areH-semi-primes. 125 = 5 × 5 × 5 is not an H-semi-prime, because it's the product of threeH-primes.InputEach line of input contains an H-number ≤ 1,000,001. The last line of input contains 0 and this line should not be processed.OutputFor each inputted H-number h, print a line statingh and the number of H-semi-primes between 1 and h inclusive, separated by one space in the format shown in the sample.Sample Input
21
85
789
0
Sample Output
21 0
85 5
789 62
筛出题目定义的H-semi-prime,之后打一张表或者二分。
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <stack>#include <bitset>#include <queue>#include <set>#include <map>#include <string>#include <algorithm>#define FOP freopen("data.txt","r",stdin)#define FOP2 freopen("data1.txt","w",stdout)#define inf 0x3f3f3f3f#define maxn 1000010#define mod 1000000007#define PI acos(-1.0)#define LL long longusing namespace std;bool vis[maxn];int prime[maxn];int cot;bool sp[maxn];int sp_num[maxn];int cot2;void sieve(int n){int m = (int)sqrt(n+0.5);for(int i = 5; i <= m; i += 4) if(!vis[i])for(int j = i*i; j <= n; j += i) vis[j] = 1;for(int i = 5; i <= n; i += 4) if(!vis[i]) prime[cot++] = i;for(int i = 0; i < cot; i++){for(int j = 0, num = prime[i] * prime[j]; j <= i && num <= n; num = prime[i] * prime[++j]){if(!sp[num]) sp[num] = 1, sp_num[cot2++] = num;}}sort(sp_num, sp_num + cot2);}int main(){//FOP;sieve(1000001);int n;while(~scanf("%d", &n) && n){int ans = upper_bound(sp_num, sp_num+cot2, n) - sp_num;printf("%d %d\n", n, ans);}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: