解题方法:用a[ n ] 表示n的另一半的编号。初始化a[i]为1。a[ n ]为n的所有小于n的因子的和。
从2开始,2的每个倍数的a[ ] 都加上2,如a[4]+2 ,a[6]+2 , a[8]+2 .....
从3开始,3的每个倍数的a[ ] 都加上3,如a[6]+3 ,a[9]+3 , a[12]+3 .....
.
.
从n/2开始,n/2的每个倍数的a[ ] 都加上n/2,如a[n/2]+n/2 ,a[n]+n/2 .....
AC代码:
//1215 21:02
#include<stdio.h>
#define NUM 500005
int a[NUM];
int main()
{
int i,n,t,j;
for(i=1;i<=NUM;++i){
a[i]=1;
}
for(i=2;i<=NUM/2;++i){
for(j=i+i;j<=NUM;j+=i){
a[j]+=i;
}
}
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}