hihoCoder 1187

今天BC爆0了。。。。但是日子还是要过的。。。。要回学校毕业了~~大学就这么“荒废”了。

这个是hihoCoder的1187,比较基础的一道题。

题目链接:

http://hihocoder.com/problemset/problem/1187

首先我们想,任何一个数可以质因数分解,且分解的方法唯一。

n = (p1 ^ k1) * (p2 ^ k2) * .... * (ps ^ ks)

约数(n) = (k1+1)*(k2+1)*(k3+1)* .... *(ks+1)

那么剩下的问题就简单了,贪心,显然在约数个数相同的情况下,pi越小越好。

暴力枚举ki,pi显然不用搜太多,目测搜到43就绰绰有余了。

ki搜到60即可,不放行的话,还可以参考线这个优化,k1 >= k2 >= ... >= ki。

证明不复杂~~

代码:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 typedef long long int64;
 5 int64 prim[14] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43};
 6 
 7 int64 ans, Max;
 8 int64 n;
 9 
10 void dfs( int id, int pre_cnt, int64 num, int64 res ){
11   if( res > Max ){
12     ans = num;
13     Max = res;
14   }else if( res == Max ){
15     ans = min( ans, num );
16   }
17 
18   int64 tmp = 1;
19   for( int i = 1; i <= 60; ++i ){
20     tmp *= prim[id];
21     if( num * tmp > n )
22       return;
23     dfs( id+1, i, num*tmp, res*(i+1) );
24   }
25 }
26 
27 int main(void){
28   while(cin >> n){
29     ans = 1, Max = 1;
30 
31     int64 tmp = 1;
32     for( int i = 1; i <= 60; ++i ){
33       tmp *= prim[0];
34       if( tmp <= n )
35         dfs( 1, i, tmp, i+1 );
36     }
37 
38     printf("%lld
", ans);
39   }
40 
41   return 0;
42 }
View Code
原文地址:https://www.cnblogs.com/zhazhalovecoding/p/5449468.html