大家一起做训练 第一场 E Number With The Given Amount Of Divisors

题目来源:CodeForce #27 E

题目意思和题目标题一样,给一个n,求约数的个数恰好为n个的最小的数。保证答案在1018内。

Orz,这题训练的时候没写出来。

这道题目分析一下,1018的不大,比264要小,所以这题可以枚举。

一个数 A 可以分解成 p1k1 * p2k2 * …… * pnkn 其中p为素数。这样分解之后,A的因子个数

S = (k1+1) *( k2+1) * …… *( kn+1)

然后用dfs枚举 + 剪枝。

剪枝的话大于现有结果return。就这样就能AC了。

附AC代码(手残,勿喷):

   1: #include <iostream>

   2: #include <cstdio>

   3: #include <cmath>

   4: #include <cstdlib>

   5: #define LL __int64

   6: using namespace std;

   7:  

   8: const LL MAX = 1e18 + 9;

   9: const LL p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};

  10: LL res;

  11:  

  12: void dfs(LL now, LL num, LL x, LL n)

  13: {

  14:     if (num > n) return;

  15:     if (num == n && res > now)

  16:     {

  17:         res = now;

  18:         return ;

  19:     }

  20:     for (int i = 1; i <= 64; i++)

  21:         if (now * p[x] > res)

  22:             break;

  23:         else

  24:             dfs(now *= p[x], num * (i+1), x+1, n);

  25: }

  26:  

  27: int main()

  28: {

  29:     int n;

  30:     while(~scanf("%d", &n))

  31:     {

  32:         res = MAX;

  33:         dfs(1, 1, 0, n);

  34:         printf("%I64d\n", res); 

  35:     }

  36: }

上一篇:ios监听ScrollView/TableView滚动的正确姿势


下一篇:分布式监控系统Zabbix3.2跳坑指南