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就可以按照这棵树来写。

codeforces 27 E. Number With The Given Amount Of Divisors(数论+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;
}
上一篇:使用 win10 的正确姿势 (第二版)


下一篇:考研路之C语言