Harmonic Number (II)
Time Limit: 3 second(s) | Memory Limit: 32 MB |
I was trying to solve problem '1234 - Harmonic Number', I wrote the following code
long long H( int n ) {
long long res = 0;
for( int i = 1; i <= n; i++ )
res = res + n / i;
return res;
}
Yes, my error was that I was using the integer divisions only. However, you are given n, you have to find H(n) as in my code.
Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.
Each case starts with a line containing an integer n (1 ≤ n < 231).
Output
For each case, print the case number and H(n) calculated by the code.
Sample Input |
Output for Sample Input |
11 1 2 3 4 5 6 7 8 9 10 2147483647 |
Case 1: 1 Case 2: 3 Case 3: 5 Case 4: 8 Case 5: 10 Case 6: 14 Case 7: 16 Case 8: 20 Case 9: 23 Case 10: 27 Case 11: 46475828386 |
题意:就是计算所给的函数的值,但是咱们如果按函数那种算法会TLE,so
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int main() { int t, n, l = 1; scanf("%d", &t); while(t--) { scanf("%d", &n); long long k = sqrt(n); long long res = 0; for(int i = 1; i < k+1; i++) { res += n /i; if(n/i > n / (i+1)) res += (n/i - n / (i+1))*i; if((k*k + i - 1) == n) // 在k*k到k*k+k-1中的数多加了k,so减去 { res -= k; } } printf("Case %d: %lld\n", l++, res); } return 0; }
让未来到来 让过去过去