素数筛选

  题目连接:http://poj.org/problem?id=3292

  题意:4n+1称为H数,如果一个H数的约数中不存在H数(1除外),那么他就是H素数,否则就是H合数;如果一个H数是两个H数的乘积,那么它就是H合成数。求n以内有多少H合成数。

  思路:首先把几何内所有的数(4n+1)定位0,表示它为H素数,然后两个H素数的乘积标记为1,表示H合成数。如果不是两个H素数的乘积,那么就标记为-1,表示H合数。最后统计一遍得到结果。

#include<cstdio>
#include<cstring>
#include<algorithm> 
#include<iostream>
using namespace std;

const int Max = 1000050;
int H_semi_prime[Max];
void solve(){
    int i,j;
    memset(H_semi_prime,0,sizeof(H_semi_prime));
    for(i = 5 ; i <=Max;i+=4)        
    {
        for(j = 5 ; j <=Max ; j +=4)    
        {
            int temp = i * j;
            if(temp>Max) 
                break;
            if(H_semi_prime[i]==0&&H_semi_prime[j]==0)    //H_prime    
                H_semi_prime[temp]= 1;        //H_semi_primes
            else
                H_semi_prime[temp] = -1;    // H_composite
         } 
    } 
    int ant = 0;
    for(i = 1 ; i <=Max;i++)
    {
        if(H_semi_prime[i]==1)
            ant++;
        H_semi_prime[i] = ant;
    }
} 

int main(){
    solve();
    int l;
    while(scanf("%d",&l),l)
        printf("%d %d\n",l,H_semi_prime[l]);
    return 0;
}

 

posted @ 2018-08-14 09:45  chase丶月光  阅读(113)  评论(0)    收藏  举报