LightOJ 1234

这题目很简单明了 求一个项数很大的 调和数级。。。。

如果正常求得话 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值