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;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6893237.html