题意:给出一个数S,求一个最大的数,使这个数所有的因子之和为S;
这个所谓“因子之和”不知道有没有误导性,因为一开始以为得是素数才行。后来复习了下小学数学,比如12的因子分别是1,2,3,4,6,12...
我竟无言以对T^T...
感觉复杂度应该能继续优化的。。没想到好的。。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 const int maxn = 1010; 8 int vis[maxn], prime[maxn], cnt; 9 void pre() 10 { 11 int m = sqrt(maxn+0.5); 12 vis[0] = 1; 13 vis[1] = 1; 14 for(int i = 2; i <= m; i++) 15 if(!vis[i]) 16 for(int j = i*i; j < maxn; j+=i) 17 vis[j] = 1; 18 cnt = 0; 19 for(int i = 2; i < maxn; i++) 20 if(!vis[i]) 21 prime[cnt++] = i; 22 } 23 24 int main() 25 { 26 pre(); 27 int S, kase = 0; 28 while(~scanf("%d", &S) && S) 29 { 30 if(S == 1) {printf("Case %d: 1\n", ++kase); continue;} 31 bool exist = false; 32 int i; 33 for(i = S-1; i >= 1; i--) 34 { 35 // if(!vis[i]) 36 // { 37 //cout << i << endl; 38 int sum = 0; bool ok = true; 39 for(int j = 1; j <= sqrt(i); j++) 40 { 41 int tmp = i/j; 42 //cout << tmp << endl; 43 if(sum > S) {ok = false; break;} 44 if(tmp*j != i) continue; 45 if(tmp != j) sum += j; 46 sum += tmp; 47 } 48 if(sum == S) {exist = true; break;} 49 // } 50 } 51 if(exist) printf("Case %d: %d\n", ++kase, i); 52 else printf("Case %d: -1\n", ++kase); 53 54 } 55 return 0; 56 }