题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1562
分析:详见上上篇博文
代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int pri[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
unsigned long long int n,ans,ansnum;
void dfs(int p,unsigned long long int sum,long long int num)
{
if(p>16) return;
if(sum>n) return;
if(ansnum<num)
{
ansnum=num;
ans=sum;
}
if(ansnum==num) ans=min(ans,sum);
int i;
for(i=1;i<=63;i++)
{
if(n/pri[p]<sum) break;
dfs(p+1,sum*=pri[p],num*(i+1));
}
return;
}
int main()
{
while(scanf("%llu",&n)==1)
{
ans=n+1;
ansnum=0;
dfs(1,1,1);
printf("%llu\n",ans);
}
return 0;
}