POJ 3292 Semi-prime H-numbers

题意:

H_Number 是一个比4的倍数多1的数,即4n + 1。H_Number 分为 H_Prime 和 H_Comosite。其中 H_Prime 仅能由1×h组成,而 H_Composite 除了1和h可有多个因子。H_Semi_Prime 表示仅有两个 H_Prime 因子(除了1和本身)。

问:给一个 H_Number,求出1到 H_Number 中有多少个 H_Semi_Prime。

思路:

打表,表分为三种情况,0表示H_Number,1表示H_Semi_Prime, - 1表示H_Composite。先将表都初始化为0,然后从小到大打。

#include <iostream>
#include <cstring>
using namespace std;

const int MAX_H = 1000001;
int H_number[MAX_H + 1];
int Count[MAX_H];
int H;
void init() {
	memset(H_number, 0, sizeof(H_number)); // H_number[x]==0表示x是H_Prime;
	for (int i = 5; i <= MAX_H; i += 4)
	for (int j = 5; j <= MAX_H; j += 4) {
		if (i*j > MAX_H) break;
		if (H_number[i] == 0 && H_number[j] == 0)
			H_number[i*j] = 1; // 表示i*j为H_semi_Prime
		else
			H_number[i*j] = -1; // 表示i*j为H_Composite
	}
	Count[1] = 0; // 统计
	for (int i = 5; i <= MAX_H; i += 4)
	if (H_number[i] == 1) Count[i] = Count[i - 4] + 1;
	else Count[i] = Count[i - 4];
}
void solve() {
	printf("%d %d\n", H, Count[H]);
}
int main()
{
	init();
	while (cin >> H && H) {
		solve();
	}
	return 0;
}

转载于:https://www.cnblogs.com/demian/p/7407317.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值