codeforces 27 E. Number With The Given Amount Of Divisors(数论+dfs)
题目链接: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; }