poj3292 素数筛选

来源:互联网 发布:php 图片裁剪上传插件 编辑:程序博客网 时间:2024/06/08 03:55

题目链接点击打开链接

题意:h数为4*n + 1 的数 , h数可以分为unit (只有数字1) , h素数 和 h合成数, h素数类似素数的定义。 h_semi_prime为两个h_素数的积。输入h,求1到h之间有多少个h_semi_prime。

思路: 主要是刷选出h素数,可模仿 埃氏筛法 。最开始素数筛选有问题导致wrong answer

#include <iostream>#include <stdio.h>#include <algorithm>#include <string>#include <string.h>#include <math.h>using namespace std;const int maxn = 1e6 + 5 ;bool is_H_prime[maxn] , is_H_si[maxn] ;int H_prime[maxn] , p = 0 , H[maxn];void Prime(){    memset(is_H_prime , true , sizeof(is_H_prime)) ;    for(int i = 5 ; i < maxn ; i += 4)    {        if(is_H_prime[i])        {            H_prime[p++] = i ;            for(int j = 5*i ; j <  maxn ; j += 4*i ) //attention            {                is_H_prime[j] = false ;            }          /*            for(int j = i + i ; j < maxn ; j += i)            {                if((j - 1)%4 == 0)                {                    is_H_prime[j] = false ;                }            }*/        }    }}void solve(){    memset(is_H_si , false , sizeof(is_H_si)) ;    for(int i = 0 ; i < 166 ; i ++)    {        for(int j = i ;  H_prime[j] <= maxn/H_prime[i] ; j ++)        {            int t = H_prime[i] * H_prime[j] ;            if( t < maxn)                is_H_si[t] = true ;        }    }    int Count = 0 ;    for(int i = 1 ; i < maxn ; i ++ )    {        if (is_H_si[i]) Count ++ ;        H[i] = Count ;    }}int main(){    Prime() ; solve() ; // 打表,预处理    int number ;    while(scanf("%d" , &number) != EOF && number)    {        printf("%d %d\n" , number , H[number]) ;    }    return 0;}


0 0
原创粉丝点击