11105 - Semi-prime H-numbers(筛法)
2015-09-05 16:05
393 查看
该题新定义了一种H数,还有几个概念,要搞清楚:
1.H素数:本身不是1,不能写成两个不是1的H数才乘积。
2.H半素数:能写成2个H素数乘积的H数(注意,还得是H数)
这样我们就可以利用筛选法的思想,通过类似筛法求素数的方法筛出所有H素数。
细节参见代码:
1.H素数:本身不是1,不能写成两个不是1的H数才乘积。
2.H半素数:能写成2个H素数乘积的H数(注意,还得是H数)
这样我们就可以利用筛选法的思想,通过类似筛法求素数的方法筛出所有H素数。
细节参见代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 1000000000; const int maxn = 1000000+1; int n,m,v,cnt=0,cur = 0,vis[maxn+5]={0},prime[maxn+5],a[maxn+5]={0}; void init() { cnt = 0; for(int i=1;(i*4+1)*(i*4+1)<=maxn;i++) if(!vis[i]) //类似筛法求素数 for(int j=i;(i*4+1)*(j*4+1)<=maxn;j++) vis[4*i*j+i+j] = 1; //意思就是4*(4*i*j+i+j)+1是H素数,暗含了它还是H数 for(int i=1;i*4+1<=maxn;i++) { if(!vis[i]) prime[cnt++] = i*4+1;//保存H素数 } for(int i=0;i<cnt;i++) { if(prime[i]*prime[i]>maxn) break;//计算H半素数 for(int j=i;j<cnt;j++) { if(prime[i]*prime[j]>maxn) break; a[prime[i]*prime[j]] = 1; } } for(int i=1;i<=maxn;i++) a[i] += a[i-1];//打表记录答案 } int main() { init(); while(~scanf("%d",&n)&&n) { printf("%d %d\n",n,a ); } return 0; }
相关文章推荐
- 分布式定时任务框架比较,spring batch, tbschedule jobserver
- php设计模式——工厂方法模式(Factory Method)
- 分布式与集群的联系与区别
- 微型 ORM-FluentData 温故知新系列
- linux文件系统—删除文件
- 如何在Allegro16.3里设置Xnet并进行等长设置
- HDU5007-Post Robot-2014西安网络赛(字符串水题)
- quartz集群分布式(并发)部署解决方案-Spring - 推酷
- Linux内核从原理到代码详解课程下载
- Spark1.4 和 Hive 1.1.1 启动错误
- POJ 3895 Cycles of Lanes
- 二叉树先序遍历的理解
- #研发中间件介绍#定时任务调度与管理JobCenter - 旁观者 - 博客园
- 【NOIP2007】第四题·Hanoi双塔问题
- 详解OpenGL中的各种变换(投影变换,模型变换,视图变换)(一)——模型变换和视图变换
- mysql中1064错误和字符处理
- linux中信号完成量completion
- 分享一个分布式定时任务系统 ( python) - V2EX
- leetcode: (100) Same Tree
- test code