LightOJ 1234(調和級數、有通項公式的發散數列求和)
阿新 • • 發佈:2019-02-01
調和級數求和(1/1+1/2+1/3+……..+1/n)
可用於大數有通項公式的求和計算
利用分組來平衡記憶體和時間
#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <set>
#include <string>
#include <ctime>
using namespace std;
#define ll long long
const int MAXN = 100000000+100;
const int mod = 100;//組距
double a[MAXN/mod];//儲存每組開頭的數的大小
void Init()
{
double tmp=1.0;
a[0]=0.0;
for(int i=2;i<=MAXN;i++)
{
tmp+=1.0/i;
if(i%mod==0)
{
a[i/mod]=tmp;
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
Init();
for(int cas=1; cas<=T; cas++)
{
int n;
scanf("%d",&n);
int p=n/mod;
double ans=a[p];
for(int i=p*mod+1;i<=n;i++)
{
ans+=1.0 /i;
}
printf("Case %d: %.10lf\n",cas,ans);
}
return 0;
}