您的位置:首页 > 其它

UVa 11526 - H(n)

2015-03-24 23:19 204 查看
根据给出的式子可以知道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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: