根据给出的式子可以知道H(n)就是n / i, i = 1, 2, 3...n之和。
例如: 10 / 1 = 10
10 / 2 = 5
10 / 3 = 3
10 / 4 = 2
10 / 5 = 2
10 / 6 = 1
10 / 7 = 1
10 / 8 = 1
10 / 9 = 1
10 / 10 = 1
则H(n) = 10 + 5 + 3 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 27
可以发现n / i 是从n -> 1 的, 10 / 1 = 10, 10 / 2 = 5, 那么10 / k, 5 < k <= 10的数全部为一; 一次类推, 10 / 3 = 3, 那么10 / k, 3 < k <= 5都为2。
要注意最后的处理, 当处理到中间的数时, 会出现最后的数没有加到结果里的情况。
#include <iostream>
#include <cstdio>
using namespace std;
long long H(long long n) {
long long res = 0;
long long e, o, i = 1;
while(n / i >= i) {
if(i & 1) e = n / i;
else o = n / i;
if(i > 1) {
if(i & 1) res += (o - e) * (i - 1);
else res += (e - o) * (i - 1);
}
res += n / i;
i++;
}
res += (n / (i - 1) - (i - 1)) * (i - 1);
return res;
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
long long n;
cin >> n;
cout << H(n) << endl;
}
return 0;
}