POJ 3292 Semi-prime H-numbers(另类筛选)
2016-04-09 11:45
351 查看
http://poj.org/problem?id=3292
题意:给出一个数n,问从1~n,有多少个数,被拆分成除1以外的被4除余1的数的时候,只有两项。比如125=5*5*5,被拆成了三项,就不符合条件。
由于有多组数据,而且可能数据挺大,为了避免重复运算,所以选择打表,一次性算完最大的数据。对于一个除1以外被4除余1的数,如果它不能够被拆分,那么它乘以比它小的不能够被拆分的数,刚好就是满足题目条件的数。如果它可以被拆分,那么它乘以比它小的除1以外被4除余1的数,一定是不满足题目条件的数。
题意:给出一个数n,问从1~n,有多少个数,被拆分成除1以外的被4除余1的数的时候,只有两项。比如125=5*5*5,被拆成了三项,就不符合条件。
由于有多组数据,而且可能数据挺大,为了避免重复运算,所以选择打表,一次性算完最大的数据。对于一个除1以外被4除余1的数,如果它不能够被拆分,那么它乘以比它小的不能够被拆分的数,刚好就是满足题目条件的数。如果它可以被拆分,那么它乘以比它小的除1以外被4除余1的数,一定是不满足题目条件的数。
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #define N 1000009 using namespace std; int cnt, sum, flag , a , n, ans ; bool is_prime ; int main() { cnt = 0; for (int i = 1; i <= 250000; i++) { cnt++; a[cnt] = i*4+1; } memset(flag, 0, sizeof(flag)); for (int i = 1; i <= cnt; i++) { if (flag[a[i]] == 0) { for (int j = 1; j <= i; j++) if (flag[a[j]] == 0) { if (a[i] * a[j] > 1000001) break; flag[a[i]*a[j]] = 1; } } else { for (int j = 1; j <= i; j++) { if (a[i] * a[j] > 1000001) break; flag[a[i]*a[j]] = -1; } } } ans[1] = 0; for (int i = 2; i <= 1000001; i++) if (flag[i] == 1) ans[i] = ans[i-1]+1; else ans[i] = ans[i-1]; while (~scanf("%d", &n) && n != 0) { printf("%d %d\n", n, ans ); } return 0; }
相关文章推荐
- 第五季:在UEFI+GPT模式下安装Windows 8.1
- imageloder默认参数配置
- 进阶光照与材质之物体和材质
- 乱码问题的解决
- 推送通知 Swift 菜鸟指南
- GCC与Makefile入门
- dp与px的区别
- 哈希表算法通俗理解和实现
- java虚拟机内存结构----《深入理解java虚拟机》读书笔记
- 第四季 在UEFI+GPT模式下用GHOST安装系统
- python 学习笔记3(循环方式;list初始化;循环对象/生成器/表推导;函数对象;异常处理)
- Allegro之Win7下不能实时刷新操作显示的问题
- 纯CSS实现各类气球泡泡对话框效果
- EditText限制输入的小数点只能一个
- 山东省第四届 A Rescue The Princess
- 终于能轻松一阵了
- Android-使用ScrollView设置滚动界面
- 第三季:UEFI SecureBoot ESP MSR等相关名词解释
- 探索HashMap实现原理及其在jdk8数据结构的改进
- C++ 单位整型计算器,仅支持带括号的四则运算。初学c++第一个个人作品