「中山纪中集训省选组D2T1」书堆 欧拉常数

题目描述

蚂蚁是勤劳的动物,他们喜欢挑战极限。现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍。书是形状大小质量都一样的矩形。蚂蚁要把这些书摆在水平桌子的边缘。蚂蚁喜欢整洁的布置,所以蚂蚁规定书本必须水平摆放,宽必须平行于桌缘(如图),而且不允许同一高度摆多本书。
示例图片
蚂蚁想要让书本伸出桌子边缘尽量远,同时不让书因为重力垮下来。它们已经用不知道什么方法测出了书的长度M(如图)。如果总共有N本书,请你帮忙计算如何摆放使得最多水平伸出桌缘多远。你不用考虑蚂蚁用什么方法搭建这堆书。
如果某本书以上的所有书的重心的竖直射影不在这本书上,或者正好落在在这本书的边界上,那么这堆书是不稳定的,会因为重力而垮下来。

注意:
不考虑地球自转,重力系数也不因高度改变;
书是质量均匀,质地坚硬的理想二维物体;
在不会垮的前提下,每本书的位置坐标可以是任意实数。

输入格式

输入文件仅含一行,两个正整数NM,表示书本数和书本长度。

输出格式

输出仅包含一行,整数L,表示水平延伸最远的整数距离 (不大于答案的最大整数,详见样例)

样例

样例输入1

1 100

样例输出1

49

样例输出1

2 100

样例输出2

74

数据范围

10%的数据中N5
20%的数据中N103
40%的数据中N107
100%的数据中N1018;答案106

题解

fi表示i本书达到最大位置时最下方的书与最上方的书的中点的距离。显然,f1=0
那么先考虑怎么通过f的前i个值计算出fi+1
f的前缀和为g,那么前i本书的总重心与最上方的书的中点的距离是gii。而要保证伸出的距离最长,显然应该让上面i本书的总重心落在第i+1本书的边缘上。这样就会发现,fi+1=gii+M2。这样,我们就可以递推计算答案了。
但是,N1018级别的,这样的递推公式没法满足我们,我们首先得将g消去。
考虑到gi=gi1+fifi=gi1i1+M2,将他们代入上式。

fi+1=gi1+gi1i1+M2i+M2=igi1i1+M2i+M2=gi1i1+M2+M2i=fi+M2i

这样,我们就有了用fifi+1的方法,也就知道了fi=k=1i1M2k,而我们要求的N本书的最长延伸距离恰好就等于fN+1,也就是Mi=1N12i。我们只需要快速求出正整数的倒数和,就可以快速计算f了。

至于如何求正整数的倒数和呢?当N107时,我们可以O(N)暴力求解,然而N更大的话就会超时。但同时我们可以注意到,答案不超过106,相当于我们只要求出答案的前6位有效数字即可,于是我们可以借助欧拉常数计算,如下:

γ=limni=1n1iln(n)

于是当N很大时,我们可以用ln(N)γ相加求出正整数的倒数和的近似值。至于γ具体是多少,可以通过暴力计算i=11091iln(109)的差得出近似值,大约是0.57721566

吐槽:这题不知道欧拉常数就做不了啊(虽然欧拉常数基本可以当成一个常识了)……不知道的人就算推出倒数和的形式也搞不出来啊……

Code:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
ll n;
int m;
int main()
{
	scanf("%lld%d", &n, &m);
	if (n <= 10000000)
	{
		long double ans = 0;
		for (int i = 1; i <= n; i++)
			ans += 1 / (long double)i;
		ans /= 2;
		printf("%d\n", int(ans * m - 1e-6));
	}
	else
	{
		long double ans = (log(n) + 0.57721566) / 2;
		printf("%d\n", int(ans * m - 1e-6));
	}
}
posted @   ModestStarlight  阅读(381)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示