题目详情:点击打开链接
这道题其实很简单,只需要一个简单的筛法即可,但是在解决这个问题的过程中遇到了问题。
以前一直以为数论里的运算时间超时是因为算法不够好的原因,这次的题让我知道,原来可能是输入数据个数很多,导致每一个数都需要调用一次算法,所以可以先生成结果表。然后再直接调用输出就可以了。
#include <cstdlib>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
#include <list>
#include <deque>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>
#include <memory.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#define ll long long
using namespace std;
#define N 500001
int factor[N];
int main()
{
int T;
int n, sum = 0;
//筛法,遍历所有的可能性
for(int i = 1; i <= N; i++)
factor[i] = 1;
for(int i = 2; i <= N/2; i++)
{
for(int j = 2; i*j < N; j++)
{
factor[i*j] += i;
}
}
cin >> T;
while(T--)
{
cin >> n ;
cout << factor[n] << endl;
}
return 0;
}