hdu4228 (反素数)
2016-04-01 16:56
447 查看
题意:给你一个数N,找出一个最小的可以拆分成N种乘积表达形式的数x
Sample Input
2
16
19
0
Sample Output
4
840
786432
思路:比如N=2,6可以拆成2x3或者1x6两种,但不是最小的,最小的是4可以拆成1x4,2x2两种
首先可以肯定的是x必然有N*2或者是N*2-1(完全平方的情况)个约数
利用求反素数的过程求出约数为N*2和N*2-1个的最小的数
代码:
Sample Input
2
16
19
0
Sample Output
4
840
786432
思路:比如N=2,6可以拆成2x3或者1x6两种,但不是最小的,最小的是4可以拆成1x4,2x2两种
首先可以肯定的是x必然有N*2或者是N*2-1(完全平方的情况)个约数
利用求反素数的过程求出约数为N*2和N*2-1个的最小的数
代码:
#include<stdio.h> typedef __int64 LL; const LL INF=((LL)1<<62)+1; int k; __int64 p[100]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; __int64 ans; void dfs(__int64 t,int sum,int pos,int limit,int k) { if(sum==k&&ans>t) { ans=t; } if(pos>15) return; if(sum>=k) return; for(int i=1;i<=limit;i++) { if(t>ans/p[pos]||sum*(i+1)>k) break; t=t*p[pos]; dfs(t,sum*(i+1),pos+1,i,k); } } int main() { int n; while(scanf("%d",&n),n) { int nn; k=n*2; ans=INF; dfs(1,1,1,62,k); __int64 bestans=ans; ans=INF; dfs(1,1,1,62,k-1); if(bestans>ans) bestans=ans; printf("%I64d\n",bestans); } }
相关文章推荐
- Delphi “Invalid floating point operation.”错误的解决方法(使用System单元提供的Set8087CW函数禁用浮点异常)
- HttpWebRequest用法实例
- 记一次 nginx 504 Gateway Time-out
- 程序员的自我修养:有助于提高沟通能力的7本书
- 六大刹车技巧,帮你避免90%的事故
- Android USB通信
- 批量保存图片到指定文件夹中
- 62. Unique Paths
- 总结一下Intent匹配机制
- 杭电ACM1012
- 简单配置nginx使之支持pathinfo
- mac客户端上传github
- iOS 中scrollView整个页面滑动自动居中
- 读写锁(read-write lock)机制-----多线程同步问题的解决
- 讲真!轮胎到底要打多少气合适?
- OpenGL学习(一)
- MPI远程存储访问,实现的简化版参数服务器
- Codis集群环境搭建
- iOS异步加载网络图片
- 大公司里怎样开发和部署前端代码?