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
11
1
2
3
4
5
6
7
8
9
10
2147483647
Sample Output
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
题意:
F[n]=1/1+1/2+1/3+....1/n
F
[
n
]
=
1
/
1
+
1
/
2
+
1
/
3
+
.
.
.
.1
/
n
. 暴力代码已给出,优化到3秒内。
分析:
设
n/i=k
n
/
i
=
k
,
k=1的个数:(n/2,n/1],k=2的个数:(n/3,n/2],k=n的个数:(n/(n+1),n/n,]
k
=
1
的
个
数
:
(
n
/
2
,
n
/
1
]
,
k
=
2
的
个
数
:
(
n
/
3
,
n
/
2
]
,
k
=
n
的
个
数
:
(
n
/
(
n
+
1
)
,
n
/
n
,
]
,推导出其之和为:
sum=(n/1−n/2)∗1+(n/2−n/3)∗2+....(n/n−n/(n+1))∗n
s
u
m
=
(
n
/
1
−
n
/
2
)
∗
1
+
(
n
/
2
−
n
/
3
)
∗
2
+
.
.
.
.
(
n
/
n
−
n
/
(
n
+
1
)
)
∗
n
,那么暴力前1~sqrt(n),公式解sqrt(n)~n =>
sum1=n/1+n/2...n/sqrt(n),sum2=(n/1−n/2)∗1+(n/2−n/3)∗2+...(n/sqrt(n)−n/(sqrt(n)+1))∗sqrt(n)
s
u
m
1
=
n
/
1
+
n
/
2...
n
/
s
q
r
t
(
n
)
,
s
u
m
2
=
(
n
/
1
−
n
/
2
)
∗
1
+
(
n
/
2
−
n
/
3
)
∗
2
+
.
.
.
(
n
/
s
q
r
t
(
n
)
−
n
/
(
s
q
r
t
(
n
)
+
1
)
)
∗
s
q
r
t
(
n
)
除去重复的一部分:
n/sqrt(n)
n
/
s
q
r
t
(
n
)
就是结果.
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
int main() {
int T;
scanf("%d", &T);
while(T--) {
LL n, ans = 0;
scanf("%lld", &n);
LL k = 1LL * sqrt(n);
for(LL i = 1; i <= k; i++) {
ans += n / i + (n / i - n / (i + 1)) * i;
if(n / i == k) ans -= n / i; //重复计算的那一部分
}
static int p = 1;
printf("Case %d: %lld\n", p++, ans);
}
return 0;
}