题解:
给你一个数n,然后让你找到一个数m,m的因数的个数是n,让你求满足条件的m的最小的那个数。
思路:
对于每个数m来说,他都能分解成形如
m=2p1∗3p2∗5p3∗7p4∗11p5......
所以m的因子的个数为 (p1+1) * (p2+1) * (p3+1) * (p4+1)……
所以我们对每个质因子进行dfs,去把所有的情况都遍历。。。
但是因为有因数个数为n这个条件,所以可以相应的进行剪枝。
而且因为求的是满足条件的m的最小的那个,所以又可以进行剪枝了。
而且因为n很小(<1000)所以极限情况是每个质因子的指数都是1这样的话,这个数的因子个数为2的10次方,也就是1024,所以说最多准备10个素数就行。
AC代码:
#include <iostream>
#include <cstdio>
typedef long long int lli;
using namespace std;
lli ans = 1e18;
lli n;
lli a[] = {0,2,3,5,7,11,13,17,19,23,29};
void f(lli v,lli nn,lli p){
if(nn > n) return;
if(nn == n ){
if(v < ans)
ans = v;
return;
}
for(int i = 1;i <= 64;i++){
v *= a[p];
if(v >= ans)break;
if(nn < n){
f(v,nn*(i+1),p+1);
}
}
}
int main()
{
//freopen("output.txt","w",stdout);
scanf("%I64d",&n);
if(n == 1){
printf("1\n");
return 0;
}
f(1LL,1LL,1LL);
printf("%I64d\n",ans);
return 0;
}