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\n", ans); 39 } 40 41 return 0; 42 }