这个题 很久之前做数学的时候 就做过了。 但是当时没做出来。 水平很有限。
现在再看这个题 就有点简单了。 就是 求 每个数 有几个 然后乘起来就好。
这个题重在优化。 一开始 还在找规律。 结果没找到。 就去优化了。
比如 10 的时候 10 5 3 2 2 1 1 1 1 1 就是 一个 10 一个 5 一个3 两个2 5个 1 实现如下。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
#define ll long long
typedef unsigned long long ull;
#define maxn 1000+100
#define INF 1<<30
int main (){
int num;
scanf("%d",&num);
while(num--){
ll n;
scanf("%lld",&n);
ll sum = 0;
for(ll i = 2; i <= n; i++){
ll tem = n / i;
ll z = n / tem;
sum += (z - i + 1)*tem;
i = n / tem;
}
if(n >= 0)
sum += n;
printf("%lld\n",sum);
}
return 0;
}