zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JavaScript 基础第七天(DOM的开始)
    JavaScript 基础第六天
    JavaScript 基础第五天
    JavaScript 基础第四天
    JavaScript 基础第三天
    JavaScript 基础第二天
    观《幸福终点站》有感
    山东移动2014校园招聘笔试
    Genymotion虚拟Android不能联网的一种解决方法
    关于Thinkpad E420双显卡驱动安装和切换的问题
  • 原文地址:https://www.cnblogs.com/zhazhalovecoding/p/5449468.html
Copyright © 2011-2022 走看看