题目描述

蚂蚁是勤劳的动物,他们喜欢挑战极限。现在他们迎来了一个难题!蚂蚁居住在图书馆里,图书馆里有大量的书籍。书是形状大小质量都一样的矩形。蚂蚁要把这些书摆在水平桌子的边缘。蚂蚁喜欢整洁的布置,所以蚂蚁规定书本必须水平摆放,宽必须平行于桌缘(如图),而且不允许同一高度摆多本书。



蚂蚁想要让书本伸出桌子边缘尽量远,同时不让书因为重力垮下来。它们已经用不知道什么方法测出了书的长度\(M\)(如图)。如果总共有\(N\)本书,请你帮忙计算如何摆放使得最多水平伸出桌缘多远。你不用考虑蚂蚁用什么方法搭建这堆书。

如果某本书以上的所有书的重心的竖直射影不在这本书上,或者正好落在在这本书的边界上,那么这堆书是不稳定的,会因为重力而垮下来。

注意:

不考虑地球自转,重力系数也不因高度改变;

书是质量均匀,质地坚硬的理想二维物体;

在不会垮的前提下,每本书的位置坐标可以是任意实数。

输入格式

输入文件仅含一行,两个正整数\(N\)和\(M\),表示书本数和书本长度。

输出格式

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

样例

样例输入1

1 100

样例输出1

49

样例输出1

2 100

样例输出2

74

数据范围

\(10\%\)的数据中\(N\leq5\);

\(20\%\)的数据中\(N\leq10^3\);

\(40\%\)的数据中\(N\leq10^7\);

\(100\%\)的数据中\(N\leq10^{18}\);答案\(\leq10^6\)。

题解

设\(f_i\)表示\(i\)本书达到最大位置时最下方的书与最上方的书的中点的距离。显然,\(f_1=0\)。

那么先考虑怎么通过\(f\)的前\(i\)个值计算出\(f_{i+1}\)。

记\(f\)的前缀和为\(g\),那么前\(i\)本书的总重心与最上方的书的中点的距离是\(\frac{g_i}{i}\)。而要保证伸出的距离最长,显然应该让上面\(i\)本书的总重心落在第\(i+1\)本书的边缘上。这样就会发现,\(f_{i+1}=\frac{g_i}{i}+\frac{M}{2}\)。这样,我们就可以递推计算答案了。

但是,\(N\)是\(10^{18}\)级别的,这样的递推公式没法满足我们,我们首先得将\(g\)消去。

考虑到\(g_i=g_{i-1}+f_i\),\(f_i=\frac{g_{i-1}}{i-1}+\frac{M}{2}\),将他们代入上式。

\[f_{i+1}=\frac{g_{i-1}+\frac{g_{i-1}}{i-1}+\frac{M}{2}}{i}+\frac{M}{2}=\frac{\frac{i\cdot g_{i-1}}{i-1}+\frac{M}{2}}{i}+\frac{M}{2}=\frac{g_{i-1}}{i-1}+\frac{M}{2}+\frac{M}{2i}=f_i+\frac{M}{2i}
\]

这样,我们就有了用\(f_i\)求\(f_{i+1}\)的方法,也就知道了\(f_i=\sum_{k=1}^{i-1}\frac{M}{2k}\),而我们要求的\(N\)本书的最长延伸距离恰好就等于\(f_{N+1}\),也就是\(M\cdot\sum_{i=1}^{N}\frac{1}{2i}\)。我们只需要快速求出正整数的倒数和,就可以快速计算\(f\)了。

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

\[\gamma=\lim_{n\to\infty}\sum_{i=1}^{n}\frac{1}{i}-\ln(n)
\]

于是当\(N\)很大时,我们可以用\(\ln(N)\)和\(\gamma\)相加求出正整数的倒数和的近似值。至于\(\gamma\)具体是多少,可以通过暴力计算\(\sum_{i=1}^{10^9}\frac{1}{i}\)与\(\ln(10^9)\)的差得出近似值,大约是\(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));
}
}

「中山纪中集训省选组D2T1」书堆 欧拉常数的更多相关文章

  1. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  2. 「中山纪中集训省选组D4T1」折射伤害 高斯消元

    题目描述 在一个游戏中有n个英雄,初始时每个英雄受到数值为ai的伤害,每个英雄都有一个技能"折射",即减少自己受到的伤害,并将这部分伤害分摊给其他人.对于每个折射关系,我们用数对\ ...

  3. 中山纪中集训Day5叒是测试(划淼)

    A组T1 矩阵游戏(game) 九校联考24OI__D1T1 问题描述 LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M ...

  4. 中山纪中集训Day1测试(摸鱼)

    AT3 粉刷匠 Description 赫克托是一个魁梧的粉刷匠,而且非常喜欢思考= = 现在,神庙里有N根排列成一直线的石柱,从1到N标号,长老要求用油漆将这些石柱重新粉刷一遍.赫克托有K桶颜色各不 ...

  5. 中山纪中集训Day4双是测试(划沝) 九校联考-DL24凉心模拟Day2

    A组T1 锻造 (forging) 1.1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现......自己连一个史莱姆 ...

  6. 中山纪中集训Day2又是测试(划水)

    A组T1 bzoj 2674 Attack Description chnlich 非常喜欢玩三国志这款游戏,并喜欢用一些策略出奇制胜.现在,他要开始征服世界的旅途了.他的敌人有N 座城市和N 个太守 ...

  7. 纪中集训 Day 2

    今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...

  8. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

  9. 洛谷P1880 [NOI1995]石子合并 纪中21日c组T4 2119. 【2016-12-30普及组模拟】环状石子归并

    洛谷P1880 石子合并 纪中2119. 环状石子归并 洛谷传送门 题目描述1 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石 ...

随机推荐

  1. HBase应用

    太多column family的影响 每个 MemoryStore分配到的内存较少,进而导致过多的合并,影响性能   几个column family比较合适呢 推荐是:1-3个 划分column fa ...

  2. Net-NTLMv1的利用思路

    Net-NTLMv1的加密方法: 客户端向服务器发送一个请求 服务器接收到请求后,生成一个16位的Challenge,发送回客户端 客户端接收到Challenge后,使用登录用户的密码hash对Cha ...

  3. 定时任务 Scheduled quartz

    在项目应用中往往会用到任务定时器的功能,比如某某时间,或者多少多少秒然后执行某个骚操作等.spring 支持多种定时任务的实现,其中不乏自身提供的定时器.接下来介绍一下使用 spring 的定时器和使 ...

  4. 关于new FormData() 对象的用法

    formData.append()  理论上本身若键值已经存在,那么我们append的数据是进行类似push的操作,为了匹配php,我们进行加了[]  ,这个操作.!

  5. 22-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 连接和断开

    https://www.cnblogs.com/yangfengwu/p/11192618.html 有些很细致的东西参考这篇   https://www.cnblogs.com/yangfengwu ...

  6. 2019SDSC夏令营游记

    Day 1 2019.7.22 晴 第一天夏令营,是在一所大学举办的. 到之前的我好兴奋,要提前看一下大学到底是什么样的. 聊了一上午的天 坐了一上午的公交终于到了目的地,下午很自由,自己在宿舍里面休 ...

  7. [bzoj1008] 越狱

    Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 数据 ...

  8. hhhhh我又双叒进步啦!

    虽然说从今天开始短暂的暑假一周假期正式开始,然而第一天我就深感在家有多无聊...所以说还是整天待在学校好丫! 不过,就算在家, 勤奋好学的 我也要认真做题!今天就一鼓作气地把排名刷到了第 50 名!! ...

  9. 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1。 buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“\t”分割

    实验内容(mapReduce安装请按照林子雨教程http://dblab.xmu.edu.cn/blog/631-2/) 现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为 ...

  10. Java中定义不了可变长数组怎么办---集合 泛型

    一.集合(Collections) Java使用集合来组织和管理对象. 1.Java的集合类 集合类主要负责保存.盛装和管理对象,因此集合类也被称为容器类. 集合类分为Set.List.Map和Que ...