POJ3292 Semi-prime H-numbers

定义H数为4n+1,n>=0的数,H素数为H数中只能拆成1*x,x为H数的数,求1-n<=1000000中H素数的个数。

筛法。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<algorithm>
 5 #include<iostream>
 6 using namespace std;
 7 
 8 int n;
 9 #define maxn 1000011
10 int prime[maxn],lp=0;bool notp[maxn];
11 void makeprime()
12 {
13     memset(notp,0,sizeof(notp));
14     notp[1]=0;
15     for (int i=5;i<=n;i+=4)
16         if (!notp[i])
17         {
18             prime[++lp]=i;
19             for (int j=i*5;j<=n;j+=(i<<2)) notp[j]=1;
20         }
21 }
22 bool isans[maxn];int ans[maxn];
23 int main()
24 {
25     n=1000001;
26     makeprime();
27     memset(isans,0,sizeof(isans));
28     for (int i=1;i<=lp;i++)
29         for (int j=1;prime[j]*prime[i]<=n;j++)
30             isans[prime[i]*prime[j]]=1;
31     ans[0]=0;
32     for (int i=1;i<=n;i++) ans[i]=ans[i-1]+isans[i];
33     while (scanf("%d",&n) && n)
34         printf("%d %d\n",n,ans[n]);
35     return 0;
36 }
View Code

 

posted @ 2017-08-08 22:02  Blue233333  阅读(143)  评论(0编辑  收藏  举报