Harmonic Number
题目
分析
这题的打表比较有意思,一共有的计算量,这里有3秒的时限,是可以进行几次的
的计算的,可是我们没办法开一个
的数组来保存每一项的值,所以我们可以每隔50个打一个表,这样我们只需要进行一次
的计算,之后
次询问,每次我们只需要进行至多50次计算就可以了。
AC代码
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
typedef long long ll;
ll T,N;
double f[2000010];
void init(){
double cur = 0;
for(ll i = 1;i<=100000000;i++){
cur += 1.0/i;
if(i%50 == 0){
f[i/50] = cur;
}
}
}
double fun(){
double cur = f[N/50];
for(ll i = N/50*50+1;i<=N;i++){//算N%50的部分
cur += 1.0/i;
}
return cur;
}
int main(){
init();
cin>>T;
int kase = 0;
while(T--){
scanf("%lld",&N);
double res = fun();
printf("Case %d: %.9lf\n",++kase,res);
}
return 0;
} 
京公网安备 11010502036488号