提交:bzoj1053
题目↑↑
//参考hzwer大神= =
//友情链接:hzwer
本题似乎要先知道许多结论,不要问我证明。。
一个数约数个数=所有素因子的次数+1的乘积
举个例子就是48 = 2 ^ 4 * 3 ^ 1,所以它有(4 + 1) * (1 + 1) = 10个约数
然后可以通过计算得一个2000000000以内的数字不会有超过12个素因子
并且小素因子多一定比大素因子多要优
预处理出前12个素数直接爆搜即可
代码↓↓
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
int n,ans=1,num=1;
int p[15]={1,2,3,5,7,11,13,17,19,23,29,31};
void dfs(int k,ll now,int cnt,int last)
{
if(k==12)
{
if(now>ans&&cnt>num){ans=now;num=cnt;}
if(now<=ans&&cnt>=num){ans=now;num=cnt;}
return;
}
int t=1;
for(int i=0;i<=last;i++)
{
dfs(k+1,now*t,cnt*(i+1),i);
t*=p[k];
if(now*t>n)break;
}
}
int main()
{
scanf("%d",&n);
dfs(1,1,1,20);
printf("%d",ans);
return 0;
}