題目大意是給定一個數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] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}, 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(1, 1, 0);
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 閱讀(302)
評論(0) 編輯 收藏 引用 所屬分類:
Algorithm - Number Theory