题目链接:http://codeforces.com/contest/27/problem/E
题意:问因数为n个的最小的数是多少。
题解:一般来说问到因数差不多都会想到素因子。
任意一个数x=(p1^a1)*(p2^a2)*(p3^a3)*......*(pn^an);p表示素数。
然后因子数就是ans=(a1+1)*(a2+1)*(a3+1)*....*(an+1) 这个很显然。然后要使得x最小而且ans最大
显然要优先选择最小的素数。
拿12=(2^2)*3为样例可以建一个搜索树于是dfs就可以按照这棵树来写。
//deep表示深度也就是素数的种类,sum表示组成的数,然后num表示因数个数,由于n最多为1000,2^10次为1024,所以理论上只要存10个素数就行了。
void dfs(int deep , ull sum , int num) {
if(num == n) ans = min(ans , sum);
for(int i = 1 ; i <= 1000 ; i++) {
if(num * (i + 1) > n || sum * prime[deep] > ans) break;//很明显的一个剪枝
dfs(deep + 1 , sum * prime[deep] , num * (i + 1));
sum *= prime[deep];
}
}
#include <iostream>
using namespace std;
typedef unsigned long long ull;
ull ans;
int prime[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53} , n;
void dfs(int deep , ull sum , int num) {
if(num == n) ans = min(ans , sum);
for(int i = 1 ; i <= 1000 ; i++) {
if(num * (i + 1) > n || sum * prime[deep] > ans) break;
dfs(deep + 1 , sum * prime[deep] , num * (i + 1));
sum *= prime[deep];
}
}
int main() {
cin >> n;
ans = ULLONG_MAX;
dfs(0 , 1 , 1);
cout << ans << endl;
return 0;
}