思路:首先将50000以内的所有数字的因数和都求出来存储在一个数组当中
可以轻易看出,一个数的因数和等于这个数的最大因数的因数和加上最大因数。
例如:3的因数和为1,6的最大因数为3,那么6的因数和 = 3 + 1 = 4
我们可以根据这样的规律,对这个数组进行处理,采用双循环的方式,外层循环只需要循环一半的数字,内层循环j每次为外层循环i的n(n为正整数)倍,这样就可以较快的存储每个数字的因数和
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long a[500010];
int main()
{
long long i,n,j,t;
for(i = 2;i <= 500010;i++)
a[i] = 1;
//注意:这里要将0,1对应的因数和置为0
a[0] = 0;
a[1] = 0;
for(i = 2;i <= 250005;i++)
{
for(j = 2*i;j <= 500010;j += i)//j每次增加i个
{
a[j] += i;
}
}
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
printf("%lld\n",a[n]);
}
return 0;
}