解析:
直接逆用唯一分解。搜索。
约数个数公式是这道题的关键。
对于
n
=
∏
i
=
1
t
p
i
k
i
n=\prod_{i=1}^tp_i^{k_i}
n=∏i=1tpiki,
n
n
n的约数个数为
∏
i
=
1
t
(
k
i
+
1
)
\prod_{i=1}^{t}(k^i+1)
∏i=1t(ki+1)。
复杂度仍然是对数级别的。
代码:
#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(){
freopen("antip.in","r",stdin);
freopen("antip.out","w",stdout);
n=getint();
linear_sieves(min(n,(ll)50000));
dfs(1,1,1,500);
cout<<ans<<endl;
return 0;
}