POJ - 3292(Semi-prime H-numbers)素数筛法的扩展

题目大意:

给定4n+1数(1、5、9、13、……)。将这些数分为unit(即为1)和prime(不是真正的素数),composite。规定一个semi-prime数为可为两个prime数乘积。题目给定一个4n+1数,要判断1~4n+1数之间(包含1和该4n+1数)的所有semi-prime个数。

(类似于筛选素数)

附AC代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 1000010

typedef long long int ll;
using namespace std;
vector<int> v;//存放4n+1的数
bool isHP[maxn];
int ans[maxn];
void init()
{
    memset(isHP,true,sizeof(isHP));
    for(int i=5; i<maxn; i+=4)
    {
        if(isHP[i])
        {
            v.push_back(i);
            for(int j=i+i;j<maxn;j+=i)
            {
                if(j%4==1)
                    isHP[j]=false;
            }
        }
    }
    for(int i=0;i<v.size();i++)
    {
        if(v[i]>1010)//只需v[i]小于maxn的开方
            break;
        for(int j=i;j<v.size();j++)
        {
            int temp=v[i]*v[j];//temp必定是4n+1形式(易证),无需判断
            if(temp>=maxn)
                break;
            ans[temp]=1;
        }
    }
   for(int i=1;i<maxn;i++)
   {
       ans[i]+=ans[i-1];
   }
}
int main()
{
    init();
    int n;
    while(scanf("%d",&n)&&n)
    {
        printf("%d %d\n",n,ans[n]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Vici__/article/details/82901712