随笔 - 68  文章 - 57  trackbacks - 0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(8)

随笔分类(74)

随笔档案(68)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

题目大意是给定一个数n,问约数个数为n的最小的数k是多少。其中1 <= n <= 10000, k <= 10 ^ 15。
这是一个经典问题了,我一直以为会有经典算法,开始的时候一直往贪心上想,结果owen给出了反例。后来经过吉大牛点拨,因为k <= 10 ^ 15,可以根据这个定界,最差情况k的素因子也不会超过13,这样就可以搜索了!
实现的时候我也犯了几个小错,一个是把10 ^ 15少打了一个0,还有一个剪枝必须加:如果当前结果的约数个数为f,那么如果n % f不为0,则剪掉,因为约数个数是以乘积的关系累加的。
 1 #include <cstdio>
 2 const int M = 14;
 3 const long long max = 1000000000000000LL;
 4 
 5 int p[M] = {2357111317192329313741}, k;
 6 long long ans;
 7 void solve(long long v, int factor, int pos)
 8 {
 9     if (factor >= k)
10     {
11         if (factor == k)    ans <?= v;
12         return;
13     }
14     if (k % factor) return;
15     if (pos == M)   return;
16     for (int i = 1; i <= 50; i++)
17     {
18         v *= p[pos];
19         if (v > max)    break;
20         solve(v, factor * (i + 1), pos + 1);
21     }
22 }
23 
24 int main()
25 {
26     while (scanf("%d"&k) == 1)
27     {
28         ans = max + 1;
29         solve(110);
30         if (ans > max)   printf("-1\n");
31         else             printf("%lld\n", ans);
32     }
33 
34     return 0;
35 }
36 
posted on 2009-03-30 21:44 sdfond 阅读(275) 评论(0)  编辑 收藏 引用 所属分类: Algorithm - Number Theory

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理