SSL-ZYC 约束和

题目大意:
求一个数所有约数的和。


思路:
很明显是一道暴力模拟的题目。
由于数据很大,所以寻找约数时要用trunc(sqrt(n))
只要从1到trunc(sqrt(n))枚举i,找到一个约数就让sum加上i和(n/i)
注意:千万小心完全平方数!它们的i和n/i有可能相同!这时只需要加上其中一个就可以了!


代码:

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int a[5000001]; 
int n,m,sum;
int main()
{
    scanf("%d",&n);  //n组数据
    for (int i=1;i<=n;i++)
    {
        sum=0;
        scanf("%d",&m);
        if (a[m]!=0)   //剪枝。如果已经算出m的约束和,就直接输出。
        {
            printf("%d\n",a[m]);
            continue;
        }
        for (int i=1;i<=(int)(sqrt(m));i++)  //枚举
        {
            if (m%i==0)   //如果i是m的约束
            {
                sum+=i;
                if (m/i!=i) sum+=m/i;  //判断是否是完全平方数,如果不是,就加上m/i。
            }
        }
        a[m]=sum;  //剪枝专用
        printf("%d\n",sum);
    }
    return 0;
}
posted @ 2018-02-08 09:07  全OI最菜  阅读(109)  评论(0编辑  收藏  举报