传送门

Description

给定一个正整数\(n\),输出最小的整数,满足这个整数有n个因子

Input

一行一个整数\(n\)

Output

一行一个整数,代表答案。

Hint

\(1~\leq~n~\leq~1000\)。保证答案不超过\(10^{18}\)

Solution

经典题。

引理:

对于一个唯一分解式形如\(x=p_1^{c_1}p_2^{c_2}p_3^{c^3}\cdots p_k^{c_k}\)的数字\(x\),则其因数个数为\(\prod(c_i+1)\)。

证明:

考虑乘法原理,第\(i\)项的指数有\(0~\sim~c_i\)共\(c_i+1\)种方式,根据唯一分解定理的逆定理,每一项指数不同所得到的数是不同的。于是根据乘法原理,其因数个数为\(\prod(c_i+1)\)。

证毕。

定理:

考虑一个因数个数为\(n\)的最小整数\(x\),则它的唯一分解式\(x=p_1^{c_1}p_2^{c_2}p_3^{c^3}\cdots p_k^{c_k}\)中,不妨设\(p_1~<~p_2~<~p_3~<~\cdots~<~p_k\),则一定满足:\(p_1=2\),且\(\forall ~i~>~1\),\(p_i\)是大于\(p_{i-1}\)的第一个质数,同时\(\forall~i~\in~[1,k)\),\(c_i~\leq~c_{i+1}\)。

证明:

1、若\(p\)在质数表上不是连续的,不妨设\(p_i~<~q~<p_{i+1}\),则将\(p_{i+1}\)替换为\(q\),\(x\)会变小,因为\(c_{i+1}\)不变,根据引理,因数个数不变。于是替换为\(q\)答案更优,这与\(x\)是最小的有\(n\)个因子的数矛盾。

2、若\(c_i\)不是单调不升,不妨设\(c_i~<~c_{i+1}\),则将两指数交换,\(x\)会变小。同上可证因数个数不变。于是交换后答案更优,这与\(x\)是最小的有\(n\)个因子的数矛盾。

证毕。

于是发现答案的唯一分界式,\(2\)一定会出现且指数最大。考虑\(2^{64}\)已经大于\(10^{18}\),所以指数最多为\(64\)。又发现前15个质数连乘的答案已经大于\(10^{18}\),所以质数最多是15个。于是爆搜一下,分别进行一下可行性剪枝和最优性剪枝,即可通过本题。

Code

#include<cstdio>
#define rg register
#define ci const int
#define cl const long long typedef long long int ll; template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
} namespace IO {
char buf[120];
} template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {x=-x,putchar('-');}
rg int top=0;
do {IO::buf[++top]=x%10+'0';} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
} template <typename T>
inline T mmax(const T a,const T b) {return a > b ? a : b;}
template <typename T>
inline T mmin(const T a,const T b) {return a < b ? a : b;}
template <typename T>
inline T mabs(const T a) {return a < 0 ? -a : a;} template <typename T>
inline void mswap(T &_a,T &_b) {
T _temp=_a;_a=_b;_b=_temp;
} const int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53}; int n;
ll ans=1000000000000000001; void dfs(ll,int,int,int); int main() {
qr(n);
dfs(1ll,0,64,1);
qw(ans,'\n',true);
return 0;
} void dfs(ll now,int cur,int p,int cnt) {
if(cnt > n) return;
if(now <= 0ll) return;
if(now > ans) return;
if(cur > 15) return;
if(cnt == n) {ans=now;return;}
for(int i=1;i<=p;++i) {
dfs(now*=prime[cur],cur+1,i,cnt*(i+1));
}
}

Summary

对于一个唯一分解式形如\(x=p_1^{c_1}p_2^{c_2}p_3^{c^3}\cdots p_k^{c_k}\)的数字\(x\),则其因数个数为\(\prod(c_i+1)\)。

最新文章

  1. 浏览器内核、渲染引擎、js引擎
  2. 帝国cms7.0整合百度编辑器ueditor教程
  3. 为代码减负之&amp;lt;二&amp;gt;存储过程(SQL)
  4. 使用Javascript/jQuery将javascript对象转换为json格式数据 - 海涛的CSDN博客 - 博客频道 - CSDN.NET
  5. year:2017 month:7 day:27
  6. Java序列化详解
  7. Java NIO 之 Buffer
  8. IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
  9. cocos2d-x升级到3.4与创建android项目
  10. MySQL类型float double decimal的区别
  11. 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
  12. python --- 基数排序算法
  13. Round #2
  14. BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
  15. 关于MySQL慢日志,你想知道的都在这
  16. [SHOI2013]发牌 解题报告
  17. 笔记本(ThinkPad)怎样关闭触摸板
  18. 为什么今天的L4无人驾驶无法到达终局(转)
  19. 《Python》 内置函数补充、匿名函数、递归初识
  20. OK335xS Ubuntu 12.04.1 版本 Android 开发环境搭建

热门文章

  1. 初探C#
  2. 【转】微信小程序实现自动化测试
  3. jenkins升级为2.134
  4. AtCoder Grand Contest 026 D - Histogram Coloring
  5. windows中使用mysql配置my.ini时的坑
  6. 433. Number of Islands【LintCode java】
  7. CsvHelper文档-3写
  8. SQL判断是否存在
  9. 初学Objective - C语法之代码块(block)
  10. hibernate.cfg.xml案例