问题 D: 磊哥的密码箱

时间限制: 1 Sec  内存限制: 128 MB
提交: 238  解决: 61
[提交] [状态] [命题人:admin]

题目描述

磊哥有个密码箱,里面装的都是令磊哥羞羞的东西。
箱子的密码是[1,n]里面的约数最多的数的约数数目。
磊哥的女朋友想知道磊哥到底装的是什么东西?她需要你的帮助。

输入

输入一个整数T,表示有T个测试数据
下面T行,每行输入一个正整数n。

输出

对每个n,输出对应一行一个正整数表示[1,n]里最多约数的数的约数个数。

样例输入

复制样例数据

2
13
9

样例输出

6
4

提示

100%的数据满足:1 ≤ n ≤ 1,000,000,000,000,000,000.

解决这道题,涉及一点点数论的知识,点击查看。看完在看这道题(大佬随意QAQ)

具体的思路呢其实就是贪心。

根据唯一分解定理和约数个数定理,我们知道对于每一个数,写成标准分解式(n = p1^a1*p2^a2...pk^ak),约数的个数为(a1+1)*(a2+1)...*(ak+1),为了使的约数的个数尽量多,p应该尽量选小的。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,ans;
int p[]={,,,,,,,,,,,,,,,,,,};
ll qpow(ll a,ll b) //快速幂
{
ll ret=;
while(b)
{
if (b&) ret=ret*a;
a=a*a;
b>>=;
}
return ret;
}
void dfs(ll poi,ll num,ll val,ll len) //枚举第几个质数poi,现在有几个约数,现在的值,ai的最大值
{
if (val>n) return;
if (val<=n) ans=max(ans,num);
for (int i=; i<=len; i++) //相当于枚举这位质数对应的a
{
ll t=qpow(p[poi],i);
if (t>n/val) return;
dfs(poi+,num*(i+),val*t,i);
}
return;
} int main()
{
int T;
cin>>T;
while(T--)
{
ans=;
scanf("%lld",&n);
dfs(,,,);
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. linux用户权限相关内容查看
  2. C#+ AE 注意问题汇总(不断更新)
  3. 自适应UITableView的Cell高度问题
  4. 更加优雅地配置Spring Securiy(使用Java配置和注解)
  5. python操作mongodb之六自定义类型存储
  6. 制作Linux下程序安装包——使用脚本打包bin、run等安装包
  7. Why you have so few friends?
  8. VSS汉化后出现问题及解决方法
  9. 基于jQuery的TreeGrid组件详解
  10. (转载)LINUX UNBUNTU10.04 下 搭建OC编译环境
  11. CentOS添加swap分区
  12. UVA 11249 - Game(游戏)
  13. [M]表格中的天正文字转换问题
  14. mvn package 和 mvn install
  15. Struts 1 之&lt;logic&gt;标签库
  16. 函数select、poll
  17. 03-openldap服务端安装配置
  18. bzoj1208splay模板题
  19. wsgi&amp;nginx-理解
  20. UIView的无损截图

热门文章

  1. iptables设置
  2. 网站实现https访问
  3. css 点击打开遮罩
  4. Kattis - itsamodmodmodmodworld It&#39;s a Mod, Mod, Mod, Mod World (类欧几里得)
  5. fedora29 下一款截图工具shutter的安装和调试
  6. hiho #1308 : 搜索二&#183;骑士问题
  7. 【winfrom-右击快捷菜单】右击或左击时显示快捷菜单
  8. CentOS 7 各个版本的区别
  9. C++自动糖果贩卖机
  10. HDU 6136 Death Podracing (堆)