K - Semi-prime H-numbers 筛选数

K - Semi-prime H-numbers
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Description

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.

Input

Each line of input contains an H-number ≤ 1,000,001. The last line of input contains 0 and this line should not be processed.

Output

For each inputted H-number h, print a line stating h and the number of H-semi-primes between 1 and h inclusive, separated by one space in the format shown in the sample.

Sample Input

21 
85
789
0

Sample Output

21 0
85 5
789 62
 
    
 
    
一开始做这个题 一脸蒙蔽啊,完全没看懂什么意思,后来在百度上查,看了好多汉语的翻译结果好多都没有解释清楚,经过多个博客的总结,才把这道题是什么意思看懂了  
给你顶一个集合,里面的元素都是4n+1的数,即(5,9,13,17.。。。),这些数被称为H-number ,在H-number 中只有1和它本身相乘等于自己的数被称为H-primes,注意,这里跟素数的定义类似,只不过是这些因子的取值范围是在 H-numbers里面,例如9在 是数范围内虽然不是素数,但在H-numbers里面确是H-primes,因为9=1x9,你可能会说,9=3x3,但是3不在H-numbers的范围里,所以9只能 分解为1和 9,所以9是H-primes。 H-semi-primes 指的是由两个H-prime相乘得到的数,并且这个数在H-number范围之内 ,最后让你求 在 1~h之间有多少个 H-semi-primes 数

这道题是一道明显的筛选题,因此列一个筛选表,对<H-number的所有数进行判断,最后for循环,计算出要求的 H-semi-primes 的 个数
首先 把所有的数都变成0,i×j代表H-semi-primes,如果hnum[i]和hnum[j]都为0,则i×j就为H-semi-primes,标记为1


#include<iostream>  
#include<cmath> 
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#define  MAX 1000005     
using namespace std;     
int hnum[MAX];
void sprinum()
{
	long long multi;
	for(int i=5;i<MAX;i=i+4)
	{
		
		for(int j=5;i*j<MAX;j=j+4)
		{
			
			multi=i*j;
			if(hnum[i]==0 && hnum[j]==0)
				hnum[multi]=1;
			else hnum[multi]=-1;
		}
	}
	long long cnt=0;
	for(int i=1;i<MAX;i++)
	{
		if(hnum[i]==1)
			cnt++;
		hnum[i]=cnt;
	}
}
int main()
{
	int n;
	memset(hnum,0,sizeof(hnum));
	sprinum();
	while(cin>>n && n)
	{
		cout<<n<<" "<<hnum[n]<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值