Semi-prime H-numbers
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8706   Accepted: 3809

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
思路:注意H数的域是模4余1的数。如9是H数,虽然在自然数范围内9不是素数但是在H数域内9是H-prime。
#include <iostream>
#include <string.h>
using namespace std;
const int MAXN=;
bool isHprime[MAXN];
int Hprime[MAXN],top;
int h[MAXN];
void sieve()
{
memset(isHprime,true,sizeof(isHprime));
for(int i=;i<MAXN;i+=)
{
if(isHprime[i])
{
Hprime[top++]=i;
for(int j=i+i;j<MAXN;j+=i)
{
if((j-)%==)
{
isHprime[j]=false;
}
}
}
}
for(int i=;i<top;i++)
{
if(Hprime[i]>) break;
for(int j=i;j<top;j++)
{
int mul=Hprime[i]*Hprime[j];
if(mul>=MAXN)
{
break;
}
h[mul]=;
}
}
for(int i=;i<MAXN;i++)
{
h[i]+=h[i-];
}
}
int main()
{
sieve();
int n;
while(cin>>n&&n!=)
{
cout<<n<<" "<<h[n]<<endl;
}
return ;
}

最新文章

  1. 帮助你实现漂亮界面的14套免费的 HTML/CSS 源码
  2. 在DDwrt下对Firmware操作的一些技巧
  3. swoole和erlang通信测试
  4. windows下python检查文件是否被其它文件打开.md
  5. Git版本控制
  6. Hbase学习记录(1)|伪分布式安装
  7. 第十二篇、HTML常用框架收集
  8. PHP环境配置综合篇
  9. [个人原创]关于java中对象排序的一些探讨(三)
  10. Flash, Flex, Air, Flashplayer之间的相互关系是什么?
  11. 区间gcd问题 HDU 5869 离线+树状数组
  12. AngularJS中使用的表单验证
  13. 开发时候常用的js方法封装
  14. 华为有AI,这场转型战有点大
  15. AOP注解使用详解
  16. centos6.0和7.4默认网卡配置
  17. Spring Data JPA Batch Insertion
  18. FastAdmin Bootstrap-Table 自定义搜索的重写提示
  19. jquery接触初级-----juqery DOM操作实例,动态图片显示
  20. [notes] some code tips

热门文章

  1. Class文件结构(更新中)
  2. 高通平台MSM8916LCM模块移植(一)-bootloader部分【转】
  3. SQL题
  4. Java基础(7)-集合类3
  5. vue v-if with v-for
  6. C++两种字符串传参构造函数
  7. eclipse - unresolved inclusion: &lt;stdio.h&gt;
  8. SqlCacheDependency轮询数据库表的更改情况的频率
  9. dp2--合并石子(一)
  10. php:PHP解析xml的4种方法