题目描述 Description
给你一个数N,需要你算出这个数所有约数的和。(N的约数指能整除N的正整数),例如12的约数有1,2,3,4,6,12。所以约数和为1+2+3+4+6+12=28。
输入描述 Input Description
本题有多组数据,第一行一个T,表示有T组数据;下面T行,每行一个正整数N,表示要处理的数。
输出描述 Output Description
T行,每行一个正整数,表示输入中对应的数的约数和。
样例输入 Sample Input
1
12
样例输出 Sample Output
28
数据范围及提示 Data Size & Hint
首先,我们通过读题,知道要求T个数的因数和,但是数据很坑,有些数重合了:【数据范围】
对于20%的数据,T=1
对于50%的数据,T<=5000
对于80%的数据,T<=50000
对于100%的数据,T<=500000;N<=5000000
输入1
12
12
在这里就很坑了,如果你不记忆的话,最少也要算(2*sqrt(n))次吧?
所以要用一个数组f去记录这些数,但注意数组的范围大小!
然后不就是简单地求约数了吗?
int ys(){ //求约数
int i,s=0;
for(i=1;i*i<n;i++)
if(n%i==0)s+=i+n/i;
if(i*i==n)s+=i;
return s;
}
int main(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%d",&n);
if(f[n]==0)f[n]=ys(); //记忆这个数,看看之前有没有做过
printf("%d\n",f[n]); //输出
}