【数论,水题】UVa 11728

题目链接

题意:给出一个数S,求一个最大的数,使这个数所有的因子之和为S;

这个所谓“因子之和”不知道有没有误导性,因为一开始以为得是素数才行。后来复习了下小学数学,比如12的因子分别是1,2,3,4,6,12...

我竟无言以对T^T...

感觉复杂度应该能继续优化的。。没想到好的。。

代码:

 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
", ++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
", ++kase, i);
52         else printf("Case %d: -1
", ++kase);
53 
54     }
55     return 0;
56 }
View Code
原文地址:https://www.cnblogs.com/LLGemini/p/4355560.html