POJ3292 Semi-prime H-numbers 素数筛选

来源:互联网 发布:电脑串口测试软件 编辑:程序博客网 时间:2024/05/23 01:11

        题目大意:H-Number被定义为4*n+1的数,其中n是整数,将H-Number分为unit,H-Prime ,H-Composites,1是唯一的unit,H-Prime是它只能被唯一的两个H-Number整除

分为是1和它本身,剩下的就是H-Composites。给定一个H-Number  h,计算出1-h中有多少个H-Prime。

        仿造埃氏筛法进行H-Prime筛选就可以了。

#ifndef HEAD#include <stdio.h>#include <vector>#include <math.h>#include <string.h>#include <string>#include <iostream>#include <queue>#include <list>#include <algorithm>#include <stack>#include <map>using namespace std;#endif // !HEADbool isprime[1000002];int icount[1000002];int main(){memset(isprime, 1, sizeof(isprime));memset(icount, 0, sizeof(icount));isprime[1] = 0;for (int i = 5; i <= 1000001;i += 4){if (isprime[i]){for (int j = i * 2; j <= 1000001;j+= i){isprime[j] = 0;}}}vector<int> h_primes;h_primes.resize(89070);int index = 0;for (int i = 5; i <= 1000001; i += 4){if (isprime[i]){//h_primes.push_back(i);h_primes[index++] = i;}}memset(isprime, 0, sizeof(isprime));for (int i = 0; i < h_primes.size();i++){for (int j = i; j < h_primes.size();j++){long long res = ((long long)h_primes[i]) * h_primes[j];if (res <= 1000001){isprime[res] = 1;}elsebreak;}}int count = 0;for (int i = 0; i <= 1000001;i++){if (isprime[i]){count++;}icount[i] = count;}#ifdef _DEBUGfreopen("d:\\in.txt", "r", stdin);#endifint a;while (scanf("%d\n", &a) != EOF){if (a == 0){break;}printf("%d %d\n", a, icount[a]);}return 0;}


0 0
原创粉丝点击