POJ 3292
2016-04-24 12:03
507 查看
这道题给出了H-numbers的定义——形如4*n+1的正整数,且题目里说只考虑这些数(
接着,题目里又说这些H-numbers可以分为三种:
unite:只有一个元素1
H-primes:只能由1*h构成
H-composites:其他情况。在这里也就是由其他H-numbers相乘得到,可能是两个相乘,也可能是三个或者更多相乘。由于题目里说这考虑H-numbers,所以不必考虑其他非H-numbers相乘得到H-numbers的情况。
最后,题目里又提出H-composites的特例——H-semi-prime,仅由两个H-primes相乘得到的H-numbers。而题目就是要计算小于h的H-semi-prime个数。
写这道题如果超时,但分析一下时间复杂度也能接受,那么就说明你的预处理还不够彻底,把所有能预先计算的都预先计算,包括H-semi-prime的数量,也就是答案也要先计算出来。
代码(G++):
题目:
Semi-prime H-numbers
Time Limit: 1000MS Memory Limit: 65536K
For this problem we pretend that these are the only numbers.)。
接着,题目里又说这些H-numbers可以分为三种:
unite:只有一个元素1
H-primes:只能由1*h构成
H-composites:其他情况。在这里也就是由其他H-numbers相乘得到,可能是两个相乘,也可能是三个或者更多相乘。由于题目里说这考虑H-numbers,所以不必考虑其他非H-numbers相乘得到H-numbers的情况。
最后,题目里又提出H-composites的特例——H-semi-prime,仅由两个H-primes相乘得到的H-numbers。而题目就是要计算小于h的H-semi-prime个数。
写这道题如果超时,但分析一下时间复杂度也能接受,那么就说明你的预处理还不够彻底,把所有能预先计算的都预先计算,包括H-semi-prime的数量,也就是答案也要先计算出来。
代码(G++):
#include <iostream> #include <cstring> #include <vector> #include <ctime> #define MAX 1000002 using namespace std; bool hprime[MAX], hnum[MAX]; int ans[MAX]; vector<int> hc, hp; void initial() { int c; long long t; memset(hprime, true, sizeof(hprime)); hprime[0] = hprime[1] = false; for(int i=2; i<MAX; i++) { if(hprime[i]) { if(i%4 == 1) { for(int j=i*2; j<MAX; j+=i) { hprime[j] = false; } }else hprime[i] = false; if(hprime[i]) hp.push_back(i); } } memset(hnum, false, sizeof(hnum)); for(size_t i=0; i<hp.size(); i++) if(hp[i] < MAX) { for(size_t j=i; j<hp.size(); j++) { t = (long long)hp[i]* hp[j]; if(t <= MAX) { if(!hnum[t]) hnum[t] = true; }else{ break; } } } c = 0; for(int i=1; i<MAX; i++) { if(hnum[i]) ++c; ans[i] = c; } } int main() { int h; //double t1, t2; //t1=clock(); initial(); //小于50ms //t2 = clock(); //cout<<(t2-t1)/CLOCKS_PER_SEC*1000<<endl; while(cin>>h && h!=0) { cout<<h<<' '<<ans[h]<<endl; } return 0; }
题目:
Semi-prime H-numbers
Time Limit: 1000MS Memory Limit: 65536K
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
相关文章推荐
- IOS设计模式之迭代器模式
- 回文串---Best Reward
- 快钱报错:javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name解决
- linux之50条命令详解
- Maven最佳实践
- Git学习
- Markdown-写作必备
- IOS 开发23种设计模式
- Jenkins使用
- 《java程序设计》第八周学习总结
- 73条linux shell命令汇总
- 第9周阅读项目
- CentOS 的使用 —— 各种格式文件的解压
- 保存图片到手机相册
- Android学习资料收集
- 分享手机兼容性测试一个很好的网站,腾讯优测
- 密码学摘要
- 四个程序题!
- 笔记:Android判断版本并根据版本使用不同的代码以及旧版本XML问题
- AngularJS(0)——AngularJS环境搭建及基本概念