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 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).
OutputFor each case, print the case number and H(n) calculated by the code.
Sample Input11
1
2
3
4
5
6
7
8
9
10
2147483647
Sample OutputCase 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
题意:求f(n)=n/1+n/2.....n/n,其中n/i保留整数
分析:看了一个大神的blog,f=n/x这个函数关于y = x 对称对称点刚好是sqrt(n),
于是就简单了直接求sum+n/i (i*i<n && i >=1),然后乘以2,再减去i*i即可。
#include#include //f=N/x,对称点是sqrt(N) long long H(int N){ int K=sqrt(N); long long ans=0; for(int i=1;i<=K;i++) ans+=N/i; ans*=2; ans-=K*K; return ans;}int main(){ int T,N,cas=1; scanf("%d",&T); while(T--) { scanf("%d",&N); printf("Case %d: %lld\n",cas++,H(N)); } return 0;}