analysis
暴力!
很显然,答案就是在小于n里面的因数个数最大的数中最小的一个
于是考虑唯一分解定理,就可以借助因数个数公式暴力dfs了
由于数据范围较小,构成答案的质数个数不会多于11个,且每个质数的指数不会超过31(可以自己去算,很小的),复杂度为
∏
l
o
g
a
M
A
X
N
,
a
为
小
于
等
于
29
的
质
数
\prod log_{a}{MAXN},a为小于等于29的质数
∏logaMAXN,a为小于等于29的质数
注意longlong可能溢出,需要在乘之前处理
code
#include<bits/stdc++.h>
using namespace std;
#define loop(i,start,end) for(register int i=start;i<=end;++i)
#define anti_loop(i,start,end) for(register int i=start;i>=end;--i)
#define clean(arry,num) memset(arry,num,sizeof(arry))
#define ll long long
#define isdegit(a) ((a>='0'&&a<='9'))
template<typename T>void read(T &x){
x=0;char r=getchar();T neg=1;
while(!isdegit(r)){if(r=='-')neg=-1;r=getchar();}
while(isdegit(r)){x=(x<<1)+(x<<3)+r-'0';r=getchar();}
x*=neg;
}
int n;
const ll maxn=2000000000+10;
int num[20]={0,2,3,5,7,11,13,17,19,23,29};
int range[20]={0,31,20,14,12,9,9,9,9,9,9};//懒得算了
ll res=0;
ll fast_power(ll x,ll t){
ll _res=1;
ll stag=x;
while(t){
if(t&1){
_res*=stag;
}
t>>=1;
stag*=stag;
}
return _res;
}
ll maxtot=0;
void dfs(int pretime,int pos,ll sum,ll tot){
if(tot>maxtot){
maxtot=tot;
res=sum;
}
else if(tot==maxtot){
res=min(res,sum);
}
if(pos>11)return;
anti_loop(i,range[pos],0){
ll k=fast_power(num[pos],(ll)i);
if(sum>n||k>n||sum*k>n)continue;//这行代码的存在使得复杂度基本不可能跑满~~
dfs(i,pos+1,sum*k,tot*(i+1));
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("datain.txt","r",stdin);
#endif
read(n);
dfs(INT_MAX,1,1,1);
printf("%lld\n",res);
return 0;
}