题目链接:BZOJ - 2048

题目分析

只有一本书时,这本书的重心落在桌子边缘上,伸出桌面的长度就是 1/2。

有两本书时,第一本书的重心就落在第二本书的边缘上,两本书的重心落在桌子边缘上,两本书的重心就是在最下面一本书的右端 1/4  处。那么伸出 1/2 + 1/4 。

三本书时,可以再多伸长 3 本书的重心 1/6 。

继续计算可以发现规律,i 本书的重心就落在最下面一本书的右端 1/2i 处。

那么我们要求的伸出的总长度就是 sigma(1 / 2i) = sigma(1 / i) / 2。

sigma(1 / 2i) 就是调和级数求和,如果 n 比较小,我们就直接 O(n) 求,因为 n 比较小的时候用极限公式求误差会比较大。

如果 n 很大,我们就用调和级数的极限公式 sigma(1 / i) (i = 1 to n) = ln(n + 1) + r。r 是欧拉常数,r = 0.5772156649015328...

然后就做完了。

代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; typedef double LF;
typedef long long LL; #define r 0.5772156649 const LF Eps = 1e-10; LL n, m; LF Ans; int main()
{
scanf("%lld%lld", &n, &m);
if (n <= 1000000ll)
{
for (int i = 1; i <= n; ++i)
Ans += 1.0 / (LF)i;
}
else Ans = log((LF)(n + 1)) + r;
Ans /= 2.0; Ans *= (LF)m;
printf("%d\n", (int)(Ans - Eps));
return 0;
}

  

最新文章

  1. 类型转换器(InitBinder 初始化绑定器)
  2. android-8~23 View.java - dispatchTouchEvent源码
  3. git 上传项目到github
  4. nyoj 38 布线问题
  5. &quot;use strict&quot;
  6. 2016 Al-Baath University Training Camp Contest-1 A
  7. 解决DataSnap支持的Tcp长连接数受限的两种方法
  8. C#WinForm中在dataGridView中添加中文表头
  9. hdu 4405概率dp
  10. STL_vector
  11. HTML&amp;CSS基础学习笔记1.13—无序列表
  12. Web Api集成Swagger
  13. 【优先队列-求第Ki大的数】Black Box
  14. Markdown中使用mermaid画流程图
  15. 由会话信息保存认识ThreadLocal
  16. resin远程调试配置
  17. python接口自动化测试十六:unittest完成用例
  18. Vue+webpack项目中实现跨域的http请求
  19. Linux后门入侵检测工具
  20. Go之单元测试

热门文章

  1. 鼠标移动事件--JavaScript
  2. linux下安装apache2.4
  3. (转)Eclipse中junit框架的使用——单元测试
  4. C#获取时间戳的问题
  5. PAT_1016 部分A+B
  6. (转) UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法
  7. 四层运维工具nc
  8. Shell中特殊符号
  9. jquery 之效果
  10. javascript 事件流及应用