这题目很简单明了 求一个项数很大的 调和数级。。。。
如果正常求得话 T 很大 N也很大 ,直接求不可能的,如果暴力打表也会卡内存,所以这题还需要打表,但是是一种技巧性打表
既然 N 很大,打表不方便,我们不如稀释一下 N 如果我们只打 1e7都是可以接受的,之后就相当于把 N 上的时间花在了 T 上边,所以就是稀疏的打表。。
很简单,只要每 100 个记录一次,输入 n 的时候先找到最近的记录数字,再从这个数字加到 n ,最坏的情况跑 100 次,T*100不会炸掉,所以稀疏打表是可以过得。。。
以下是 AC 代码(据说这题可以直接套公式)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e8+5;
double num[1000005];
void init()
{
double sum = 0;
for(int i=1;i<maxn;i++)
{
sum += 1.0/i;
if(i%100 == 0)
num[i/100] = sum;
}
}
int main()
{
int t,cas = 1;
scanf("%d",&t);
init();
while(t--)
{
long long int n;
scanf("%lld",&n);
long long int x = n/100;
double sum = num[x];
for(int i=100*x+1;i<=n;i++)
{
sum += 1.0/i;
}
printf("Case %d: %.10lf\n",cas++,sum);
}
return 0;
}