记这个数字为x,可以分解质因数
x
=
p
1
c
1
p
2
c
2
.
.
.
.
p
n
c
n
x =p_1^{c_1}p_2^{c_2}....p_n^{c_n}
x=p1c1p2c2....pncn,且
p
1
<
p
2
<
.
.
.
<
p
n
p_1<p_2<...< p_n
p1<p2<...<pn。
对于2中的表达式,对于任意
i
>
1
i>1
i>1,有
c
i
−
1
>
c
i
c_{i-1}>c_i
ci−1>ci。(若
c
i
−
1
<
c
i
c_{i-1} < c_{i}
ci−1<ci,
p
i
−
1
c
i
−
1
p
i
c
i
p_{i-1}^{c_{i-1}}p_i^{c_i}
pi−1ci−1pici可以替换成
p
i
−
1
c
i
p
i
c
i
−
1
p_{i-1}^{c_i}p_i^{c_{i-1}}
pi−1cipici−1,此时约数个数相同,但可以把x变成一个更小的一个数
y
y
y,这与
x
x
x是最小的数矛盾!)
综上所述,只需要利用最小的9个质数暴搜,外加第4部分析的剪枝就可以了
代码
#include<iostream>#include<cstring>#include<algorithm>#include<cmath>typedeflonglong LL;
using namespace std;int n;//最小的9个质数int primes[]={2,3,5,7,11,13,17,19,23};//maxd最大约数个数,number为这个数字int maxd, number;//u为p的下标,c是上一个质数的指数,p是当前的数字,s是当前数字的约数个数voiddfs(int u,int c,int p,int s){if(u ==9)return;if(s > maxd || s == maxd && p < number){
number = p;
maxd = s;}//依次选1-c个质数for(int i =1; i <= c; i++){if((LL)p * primes[u]> n)return;
p *= primes[u];dfs(u +1, i, p, s *(i +1));}}intmain(){
cin >> n;dfs(0,log(n),1,1);
cout << number;return0;}