首先看到题目,感觉很简单,就是一个求约数的和的题目,但是这样做就老会TLE,得不到正确的结果,后来看了筛选法了以后,又参考了网上的代码,后来好像还是对筛选法的思想不是很熟悉。

贴一下网上的代码吧!

#include <stdio.h>
int t,n,f[500001];
void Init()
{
    int i,j;
    for (i=1;i<=250000;i++)
    {
        for (j=i+i;j<=500000;j=j+i)
            f[j]=f[j]+i;
    }
}
int main()
{
    Init();
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        printf("%d\n",f[n]);
    }
    return 0;
}

预处理好像就是把所有的先求出来,然后防止每次求值的时候就进行筛选一次,这样节省时间,相当于是以空间换时间,值得学习,就像动态规划的时候利用数组存储值一样,以免再次计算。