POJ 3292 Semi-prime H-numbers

解题思路:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值