11728 - Alternate Task

由于N的所有因子之和为S, N本身是自己的因子, 所以N不会大于S, S的值小于1000, 直接暴力即可。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 
 6 const int maxn = 2000;
 7 int prim[maxn], plen;
 8 bool vis[maxn];
 9 void mklist()
10 {
11     memset(vis, 0, sizeof(vis));
12     for(int i = 2; i * i < maxn; ++i)
13     {
14         if(!vis[i])
15         {
16             for(int j = i; i * j < maxn; ++j) vis[i * j] = true;
17         }
18     }
19     plen = 0;
20     for(int i = 2; i < maxn; ++i) if(!vis[i]) prim[plen++] = i;
21 }
22 
23 int fac[100][2], flen;
24 void split(int n)
25 {
26     flen = 0;
27     for(int i = 0; i < plen && prim[i] <= n; ++i)
28     {
29         if(n % prim[i] == 0)
30         {
31             fac[flen][0] = prim[i];
32             fac[flen][1] = 0;
33             while(n % prim[i] == 0)
34             {
35                 n /= prim[i];
36                 fac[flen][1]++;
37             }
38             ++flen;
39         }
40     }
41 }
42 int sum;
43 void dfs(int d, int s)
44 {
45     if(d == flen)
46     {
47         sum += s;
48         return;
49     }
50     int len = fac[d][1];
51     int t = 1;
52     for(int i = 0; i <= len; ++i)
53     {
54         dfs(d + 1, s * t);
55         t *= fac[d][0];
56     }
57 }
58 int main()
59 {
60     int n, id = 0;
61     mklist();
62     while(cin >> n)
63     {
64         if(n == 0) break;
65         if(n == 1)
66         {
67             cout << "Case " << ++id << ": " << 1 << endl;
68             continue;
69         }
70         int ans = n - 1;
71         for(;ans >= 0; --ans)
72         {
73             split(ans);
74             sum = 0;
75             dfs(0, 1);
76             if(sum == n) break;
77         }
78         cout << "Case " << ++id << ": " << ans << endl;
79     }
80     return 0;
81 }

 

posted @ 2013-01-29 20:25  ACSeed  Views(171)  Comments(0)    收藏  举报