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;
}