POJ 3292 Semi-prime H-numbers

本文介绍了一种高效计算H数(形如4*i+1的数)中质数与半质数的方法。通过特定的算法实现了快速判断与统计,适用于解决与H数相关的数学问题。

解题思路:

1 首先判断prime:H-numbers, 下标i表示4*i+1,j表示4*j+1,则(4*i+1)*(4*j+1)=4(4*i*j+i+j)+1,即下表i,j的乘积为下标4*i*j+i+j,判断prime方法类似判断普通prime方法,Line 10~12

2 判断Semi-prime,prime以及prime与no-prime的乘积肯定为非Semi-prime,Line 15~22

3 统计

代码
1 #include <iostream>
2  using namespace std;
3 #define MAXN 250001
4 bool IsPri[MAXN],IsSPri[MAXN];
5 int col[MAXN],pri[200];
6 int main()
7 {
8 int n,i,j,t,p,ans;
9 memset(IsPri,0x01,sizeof(IsPri));
10 for(IsPri[0]=p=0,i=1;i<251;i++)
11 if(IsPri[i])
12 for(pri[p++]=i,j=i;(4*i*j+i+j)<MAXN;j++)
13 IsPri[4*i*j+i+j]=false;
14 memset(col, 0, sizeof(col));
15 for(i=0;i<MAXN;i++)IsSPri[i]=IsPri[i]?0:1;
16 for(IsSPri[0]=i=0;i<p;i++)
17 for(t=0,j=pri[i]+1;t<MAXN;j++)
18 {
19 if(IsPri[j])continue;
20 t=j*pri[i]*4+j+pri[i];
21 if(t<MAXN)IsSPri[t]=0;
22 }
23 for(i=1;i<MAXN;i++)
24 if(IsSPri[i])col[i]=col[i-1]+1;
25 else col[i]=col[i-1];
26 while(scanf("%d", &n)&&n)
27 printf("%d %d\n",n, col[(n-1)/4]);
28 return 0;
29 }

 


转载于:https://www.cnblogs.com/ltang/archive/2011/01/03/1924979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值