// http://acm.hdu.edu.cn/showproblem.php?pid=1215
// 这和以往的求因子之和的方法不同
/* 这里的主要思想是把每个数字拆开 看函数二层循环
当j是二的倍数的时候,每个j都加上2(这个2就是他的因子),这样循环下去,就能把所有的因子之和求出来了
不会有超时的现象,时间复杂度是o(nlogn)
*/
#include<stdio.h>
int ans[500001];
void fun()
{
int i,j;
for(i=1;i<=500000;i++)
ans[i]=1;
for(i=2;i<=250000;i++)
{
for(j=2*i;j<=500000;j+=i)
ans[j]+=i;
}
}
int main()
{
int t,n;
fun();
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
}
return 0;
}
hdu 1215
最新推荐文章于 2021-06-23 20:44:19 发布