注解
1、如果对输入的每个数暴力找因数,会超时。
2、正确做法是类似于筛法求素数,先开一个大数组,然后一次性找出所有数字的因数。找因数的方法是,先找所有含因数1的数字,再找所有含因数2的数字,再找所有含因数3的数字。。。以此类推。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 500001;
int a[MAXN];
void init() {
memset(a, 0, sizeof(a));
for(int i=1; i<MAXN; i++) {
for(int j=i+i; j<MAXN; j+=i) {
a[j] += i;
}
}
}
int main() {
init();
int n;
scanf("%d", &n);
for(int i=0; i<n; i++) {
int m;
scanf("%d", &m);
printf("%d\n", a[m]);
}
return 0;
}