题意:
Hn=1/1+1/2+1/3+...+1/n
H
n
=
1
/
1
+
1
/
2
+
1
/
3
+
.
.
.
+
1
/
n
n(1≤n≤108)
n
(
1
≤
n
≤
10
8
)
思路
可以套公式的样子,不过看起来好复杂?
数据大,分成n/40组,每次从n/40 × 40 加到n
代码
//数据大,分成n/40组
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e8 + 10;
double a[ N / 40 + 1 ];
void init () {
double s = 0;
for ( int i = 1; i < N; ++i ) {
s += ( 1.0 / i );
if ( i % 40 == 0 )
a[ i / 40 ] = s;
}
}
int main () {
init ();
int T;
scanf ( "%d", &T );
for ( int k = 1; k <= T; ++k ) {
int n;
double sum;
scanf ( "%d", &n );
int x = n / 40;
sum = a[ x ];
for ( int i = 40 * x + 1; i <= n; ++i ) {
sum += ( 1.0 / i );
}
printf ( "Case %d: %.10lf\n", k, sum );
}
return 0;
}