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 }


浙公网安备 33010602011771号