您的位置:首页 > 其它

【数论,水题】UVa 11728 - Alternate Task

2015-03-21 14:21 274 查看

题目链接

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

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

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

 

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

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 1010;
int vis[maxn], prime[maxn], cnt;
void pre()
{
int m = sqrt(maxn+0.5);
vis[0] = 1;
vis[1] = 1;
for(int i = 2; i <= m; i++)
if(!vis[i])
for(int j = i*i; j < maxn; j+=i)
vis[j] = 1;
cnt = 0;
for(int i = 2; i < maxn; i++)
if(!vis[i])
prime[cnt++] = i;
}

int main()
{
pre();
int S, kase = 0;
while(~scanf("%d", &S) && S)
{
if(S == 1) {printf("Case %d: 1\n", ++kase); continue;}
bool exist = false;
int i;
for(i = S-1; i >= 1; i--)
{
//            if(!vis[i])
//            {
//cout << i << endl;
int sum = 0; bool ok = true;
for(int j = 1; j <= sqrt(i); j++)
{
int tmp = i/j;
//cout << tmp << endl;
if(sum > S) {ok = false; break;}
if(tmp*j != i) continue;
if(tmp != j) sum += j;
sum += tmp;
}
if(sum == S) {exist = true; break;}
//            }
}
if(exist) printf("Case %d: %d\n", ++kase, i);
else printf("Case %d: -1\n", ++kase);

}
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: