BZOJ传送门
洛谷传送门
解析:
有
d
a
l
a
o
dalao
dalao打表直接把69个数全部打出来了。。。(我都不好意思说我这个交的是打表的代码)
首先要知道约数个数公式:
对于一个数
n
n
n,若
n
=
∑
i
=
1
t
p
i
k
i
n=\sum_{i=1}^{t}p_i^{k_i}
n=∑i=1tpiki,其中
p
i
p_i
pi是互不相同的质数,则
n
n
n的约数个数为
∏
i
=
1
t
(
k
i
+
1
)
\prod_{i=1}^{t}(k_i+1)
∏i=1t(ki+1)
于是直接考虑深搜,指数级的增长让我们的复杂度有了保证(不想算反正就是 O ( 能 过 ) O(能过) O(能过))
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
#define st static
inline
ll getint(){
re ll num=0;
re char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))num=(num<<1)+(num<<3)+(ch^48),ch=gc();
return num;
}
bool mark[50002];
int prime[50002],pcnt;
inline
void linear_sieves(int len=50000){
mark[1]=true;
for(int re i=2;i<=len;++i){
if(!mark[i])prime[++pcnt]=i;
for(int re j=1;j<=pcnt&&i*prime[j]<=len;++j){
mark[i*prime[j]]=true;
if(i%prime[j]==0)break;
}
}
}
int ans,maxn;
ll n;
inline
void dfs(ll num,ll tot,int pos,int up){
if(maxn<tot||(maxn==tot&&num<ans)){
ans=num;
maxn=tot;
}
if(pos>pcnt)return ;
for(int re i=1;i<=up;++i){
num*=prime[pos];
if(num>n)return ;
dfs(num,tot*(i+1),pos+1,i);
}
}
signed main(){
n=getint();
linear_sieves(min(n,(ll)50000));
dfs(1,1,1,500);
cout<<ans<<endl;
return 0;
}