问题
分析
使用n/(i+1)-n/i之间的数的结果都是相同的进行优化,还有枚举方式的优化
参考:https://blog.csdn.net/qq_38687678/article/details/83030621
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
typedef long long LL;
int T,n;
LL solve(int x){
LL ans=0,t;
int i=1;
for(;i<=x;++i){ //枚举对应个数大于1的商
t=x/i-x/(i+1); //商是i的数字个数
ans+=t*i;
if(t<2) break;
}
//剩下的商都是对应个数等于1的,所以开始枚举除数
for(i=x/(i+1);i>0;--i){ //
ans+=x/i;
}
return ans;
}
int main(void){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("%lld\n",solve(n));
}
}