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; }