题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215 题目的意思就是求出一个数的除自己外的所有因数的和,为防止超时方法自然是用到预处理打表的方法,当然如果每次都求一个数n的所有
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215
题目的意思就是求出一个数的除自己外的所有因数的和,为防止超时方法自然是用到预处理打表的方法,当然如果每次都求一个数n的所有因数,那也就是说我们每次就需要重复1~sqrt(n),这样打表肯定是会超时的,所以我们可以换个思路,与其求一个数的所有因数,不如求这个数是哪些数的因数,所以我门采取反向打表,来求解。
#include<string.h>
const int maxn = 500000+2;
int a[maxn];
int main()
{
int i, j, n, t;
for(i = 1; i < maxn; i++)
for(j = 1; i * j < maxn; j++)
a[i * j] += i;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
printf("%d\n", a[n] - n);
}
return 0;
}