题意:求1/1+1/2+1/3+...+1/n的精确值。10000次访问,1e8的范围
思路:暴力先打好所有的值,大概1s就可以,然后看看空间,最大是32m,如果暴力要700多m,空间爆炸,所以缩小100倍,每隔100记录一下答案,然后每次访问就最多算100次,可以ac。
#include <bits/stdc++.h>
using namespace std;
int t, n;
double sum = 0;
vector<double> arr(1000001);
void init() {
for(int i = 1; i <= 100000000; i++) {
sum += ((double)1.0 / i);
if(i % 100 == 0)
arr[i / 100] = sum;
}
}
int main() {
cin >> t;
int s = 1;
init();
while(t--) {
cin >> n;
int d = n;
d = d / 100 * 100;
double ans = arr[d / 100];
for(int i = d + 1; i <= n; i++) {
ans += ((double)1.0 / i);
}
printf("Case %d: %.10f\n", s++, ans);
}
return 0;
}