poj 3292 H-素数问题 扩展艾氏筛选法

题意:形似4n+1的被称作H-素数,两个H-素数相乘得到H-合成数。求h范围内的H-合成数个数

思路:

h-素数                                                                                                           h-合成数

for(int i=5;i<maxn;i+=4)                                                                         for(int i=5;i<maxn;i+=4)

{   if(h_prime[i]) continue;                                                                             for(int j=5;j<maxn;j+=4){

      for(int j=i*5;j<maxn;j+=i*4) h_prime[j]=1; }                                        if(i*j>maxn)  break;    if(!h_prime[i]&&!h_prime[j])   h_sei[i*j]=1;}

注:这里的1反而不是h-素数

解决问题的代码:

#include <iostream>
#include <cstdio>
using namespace std;
#define maxn 1000010
int h_prime[maxn], h_sei[maxn], num[maxn];
void table()
{
        h_prime[1] = 0;
        for (int i = 5; i < maxn; i += 4)
        {
               if (h_prime[i]) continue;
               for (int j = i * 5; j < maxn; j += i * 4)
                       h_prime[j] = 1;
        }
        for(int i=5;i<maxn;i+=4)
               for (int j = 5; j < maxn; j += 4)
               {
                       if (i*j > maxn) break;
                       if (!h_prime[i] && !h_prime[j])
                              h_sei[i*j] = 1;
               }
        int ans = 0;
        for (int i = 5; i < maxn; i++)
        {
               if (h_sei[i]) num[i] = ++ans;
               else num[i] = ans;
        }
}
int main()
{
        int n;
        table();
        while (scanf("%d", &n)!=EOF)
        {
               if (n == 0) break;
               printf("%d %d
", n, num[n]);
        }
        return 0;
}
君子知命不惧,自当日日自新
原文地址:https://www.cnblogs.com/xuxiaojin/p/9407720.html