UVa11728 Alternate Task

来源:互联网 发布:上海网络通信设备公司 编辑:程序博客网 时间:2024/05/29 13:20

1.题目描述:点击打开链接

2.解题思路:本题可以事先打表计算出所有的数的正因子之和,然后查询即可。这里的问题是,为什么这么做就是可行的。尝试算出几个因数和之后我们会发现,如果因数和相同,那么直接更新的话自然会取较大者,因此答案是正确的。

3.代码:

#include<iostream>#include<algorithm>#include<cassert>#include<string>#include<sstream>#include<set>#include<bitset>#include<vector>#include<stack>#include<map>#include<queue>#include<deque>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<cctype>#include<complex>#include<functional>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define rep(i,n) for(int i=0;i<(n);i++)#define me(s) memset(s,0,sizeof(s))#define pb push_back#define lid (id<<1)#define rid (id<<1|1)typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> P;ll factor(ll n){    ll sum=1;    int m=(int)sqrt(n+0.5);    for(int i=2;i<=m;i++)        if(n%i==0)    {        sum+=i;        if(i!=n/i)sum+=n/i;    }    if(n>1)sum+=n;    if(sum<=1000)return sum;    else return 1000+n;}const int N=2000+10;ll a[N];void init(){    memset(a,-1,sizeof(a));    for(int i=1;i<=1000;i++)        a[factor(i)]=i;}int main(){    init();    int rnd=0;    int n;    while(~scanf("%d",&n)&&n)    {        printf("Case %d: %lld\n",++rnd,a[n]);    }}


0 0
原创粉丝点击