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