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;
}