题意
给你N(<2e9) 求N以内约数个数最多的最小的那个数?
思路
X = 2^c1 * 3^c2 * …… * 23^c9 约数个数=(c1 + 1)*(c2 + 1)*.....*(cn + 1);
2e9的范围 质因子最多用到23 质因子的次数(c1~cn)最多是30(<2^31)
且次数满足递减 c1>=c2>=c3......>=cn 这是因为约数的个数只与次数c1~cn相关,我们要找的是约数个数最大的最小的那个数,如果c2>c3将两者次数交换产生的X约数个数相等,交换后的数变大,因此次数满足递减。
综上,采取爆搜!妙啊!
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long LL;
int n,ans,Ys = 0;
int prime[10] = {0,2,3,5,7,11,13,17,19,23};
void dfs(int cnt,int C,int num,int yue){
if(yue > Ys || yue == Ys && num < ans){
ans = num;
Ys = yue;
}
if(cnt == 10) return ;
for(int i = 1;i <= C; i++){
if((LL)num * prime[cnt] > n) break;
num *= prime[cnt];
dfs(cnt + 1,i,num,yue * (i + 1));
}
}
int main()
{
scanf("%d",&n);
dfs(1,30,1,1);//第几个素数,次数不能超过,ans,Ys
printf("%d\n",ans);
return 0;
}