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。
要注意最后的处理, 当处理到中间的数时, 会出现最后的数没有加到结果里的情况。
例如: 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; }
相关文章推荐
- [UVA 11526]H(n)[数学]
- UVa 11526 - H(n)
- UVA-11526H(n)(数论)
- uva 11526 H(n) (数论)
- UVA 11526(p344)----H(n)
- UVA 11526 H(n)
- UVA_11526 H(n)
- H(n) UVA - 11526
- Uva-11526 H(n)
- UVa 11526 H(n)
- UVa 11526 - H(n)
- uva 11526
- UVA 11526 - H(n)
- uva 11526 H(n)
- UVa 11526 H(n) (数论)
- uva 11526计算n/1+n/2+...+n/n(整除)
- UVA 11526 H(n)
- 【数论,找规律】Uva 11526 - H(n)
- (UVA - 11526) H(n)
- UVA - 11526 H(n) (数学)