1. 程式人生 > >3292(Semi-prime H-numbers)素數篩法的擴充套件

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;
}