[hihoCoder 1187] Divisors (微软预科生计划-探星夏令营在线测试)
2016-04-04 21:58
357 查看
描述
Given an integer n, for all integers not larger than n, find the integer with the most divisors. If there is more than one integer with the same number of divisors, print the minimum one.
输入
One line with an integer n.For 30% of the data, n ≤ 103
For 100% of the data, n ≤ 1016
输出
One line with an integer that is the answer.样例输入
100
样例输出
60
题解:暴力必超时。每个数可以表示成素数相乘。n = p1^k1 * p2^k2 * ... * pm^km
(p1 < p2 < ... < pm)
易见,n的因子数为
(1+k1)*(1+k2)*...*(1+km)
注意数据范围,long long型!!!
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #include<string> #include<limits.h> #include<unordered_map> #include<map> #include<stack> using namespace std; bool prime[101]; int pri[101]; int k; long long res,n,ans; void init() { memset(prime,true,sizeof(prime)); pri[0]=2;k=1; for(int i=3;i<=100;i+=2) { if(prime[i]) { pri[k++]=i; } for(int j=3;i*j<=100;j+=2) { prime[i*j]=false; } } } void dfs(int cnt,long long tmp,long long tmp_count,int kk) { if(tmp*pri[cnt]>=n) { if(tmp_count>ans) { ans=tmp_count; res=tmp; } if(tmp_count==ans&&tmp<res) { res=tmp; } return; } for(int i=1;i<=k&&tmp*pri[cnt]<=n;i++) { tmp*=pri[cnt]; dfs(cnt+1,tmp,tmp_count*(i+1),i); } } int main() { scanf("%lld",&n); init(); res=n; ans=0; dfs(0,1,1,100); printf("%lld\n",res); return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- 微软无线镭射简报鲨8000激光笔记本鼠标 - (2)
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 微软镜像下载
- 微软公布2013年必应搜索十大首页美图
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 微软Word 2007数学插件 Microsoft Math 提供下载
- C++联合体转换成C#结构的实现方法
- 巧用微软EWF来保护系统
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析