水题---POJ 3292

题目:

This problem is based on an exercise of David Hilbert, who pedagogically suggested that one study the theory of 4n+1 numbers. Here, we do only a bit of that.

An H-number is a positive number which is one more than a multiple of four: 1, 5, 9, 13, 17, 21,... are the H-numbers. For this problem we pretend that these are the only numbers. The H-numbers are closed under multiplication.

As with regular integers, we partition the H-numbers into units, H-primes, and H-composites. 1 is the only unit. An H-number h is H-prime if it is not the unit, and is the product of two H-numbers in only one way: 1 × h. The rest of the numbers are H-composite.

For examples, the first few H-composites are: 5 × 5 = 25, 5 × 9 = 45, 5 × 13 = 65, 9 × 9 = 81, 5 × 17 = 85.

Your task is to count the number of H-semi-primes. An H-semi-prime is an H-number which is the product of exactly two H-primes. The two H-primes may be equal or different. In the example above, all five numbers are H-semi-primes. 125 = 5 × 5 × 5 is not an H-semi-prime, because it's the product of three H-primes.

思路:

 首先是直接暴力,把1000001以内的所有的个数达标出来,要注意!一个数只能由两个H数组成,所以在存入时要加上一个判定条件。

AC代码:

#include<cstdio>  
#include<cstring>  
#include<cstdlib>  
#include<cctype>  
#include<cmath>  
#include<iostream>  
#include<sstream>  
#include<iterator>  
#include<algorithm>  
#include<string>  
#include<vector>  
#include<set>  
#include<map>  
#include<stack>  
#include<deque>  
#include<queue>  
#include<list> 
using namespace std;
typedef long long ll;
ll res[1000010];
void init(){
//	memset(res,0,sizeof(res));
	for(ll i=5;i<250010;i+=4){
		for(ll j=i;j<250010;j+=4){
			if(i*j>1000001){
				break;
			}
			else if(res[i]==0&&res[j]==0){
				res[i*j]=1;
			}
			else {
				res[i*j]=-1;
			}
		}
	}
	int num=0;
	for(int i=5;i<=1000001;i+=4){
		if(res[i]==1) num++;
		res[i]=num;
	}
}
int  main(){
	std::ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    init();
    ll n;
    while(cin>>n){
    	if(n==0) break;
    	cout<<n<<" "<<res[n]<<endl;
	}
	return 0;
}

 优化:

埃式筛法(待补充)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值