首先看到题目,感觉很简单,就是一个求约数的和的题目,但是这样做就老会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;
}
预处理好像就是把所有的先求出来,然后防止每次求值的时候就进行筛选一次,这样节省时间,相当于是以空间换时间,值得学习,就像动态规划的时候利用数组存储值一样,以免再次计算。
转载于:https://blog.51cto.com/liu168ad/1380691