其实做这道题还蛮难受的。。。因为这个每一次有无限种可能我有钱我可以去买无限瓶可乐啊但是不是可口我不是很赞同┓( ´∀` )┏

然后参考了这篇题解发现错位相减这样的方法,让我们一起膜拜 ButterflyDew 罢!%%%%%%

不水了这题怎么做捏?首先我们根据期望 dp 的套路令 \(f_i\) 为收集 \(i\) 个不同球星期望可乐瓶数。

这道题为什么不用倒序处理呢?因为没必要,我们会发现倒序处理和正着来是等价的。

好,那么我们考虑如何从 \(f_i\) 转移到 \(f_{i + 1}\)。我们买一次有 \(\dfrac{n - i}{n}\) 的概率买到不同的,如果我们买两次,注意这里我们是恰好有一个没有买到的,如果两次都买到不同球星说明你是个欧皇那么我们就得从 \(f_i\) 转移到 \(f_{i + 2}\)。恰好没有买到,那么我们假装第一次买到第二次没买到,那么就是 \(\dfrac{n - i}{n}\times \dfrac{i + 1}{n}\)。

总而言之,如果我们买了 \(k\) 次,那么我们有 \(k - 1\) 次买到相同的,那么就是 \((\dfrac{i}{n})^{k - 1}\),还有一次我们买到不同的,因此是 \(\dfrac{n - i}{n}\),那么刚好买到一次不同的的概率是 \((\dfrac{i}{n})^{k - 1}\times \dfrac{n - i}{n}\)。

假设 \(k = \infty\) 则期望是 \(E = 1\times \dfrac{n - i}{n} + 2\times \dfrac{i}{n}\times \dfrac{n - i}{n} + 3\times (\dfrac{i}{n})^2\times \dfrac{n - i}{n} + \dots + k\times(\dfrac{i}{n})^{k - 1}\times \dfrac{n - i}{n}\)。虽然说理论上无穷大是不能随便加减乘除的但是反正我们是 OIer 不是 MOer┓( ´∀` )┏

两边同乘 \(\dfrac{i}{n}\),然后相减得到 \(E = 1 + \dfrac{i}{n} + (\dfrac{i}{n})^2 + \dots + (\dfrac{i}{n})^{k - 1} - k(\dfrac{i}{n})^k \dfrac{n - i}{n}\)。众所周知,一个大于 \(0\) 小于 \(1\) 的数字的无穷大次方无限趋于 \(0\) 因此我们可以把它看成 \(0\)(看度娘才知道的的),因此这个期望是个等差数列,\(E = \dfrac{n(1 - (\frac{i}{n})^{k - 1})}{n - i} = \dfrac{n}{n - i}\)。

因此 \(f_{i} = f_{i - 1} + E = f_{i - 1} + \dfrac{n}{n - i}\),很容易知道 \(f_n = \dfrac{n}{1} + \dfrac{n}{2} +\dots \dfrac{n}{n} = n(1 + \dfrac{1}{2} + \dots + \dfrac{1}{n})\)。

代码,这题输出确实是最难搞得,反正写起来蛮难受的说(悲

//SIXIANG
#include <iostream>
#define int long long
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
int gcd(int n, int m) {
if(!m) return n;
else return gcd(m, n % m);
}
int divide(int x) {
int len = 0;
do {
len++;
x /= 10;
} while(x);
return len;
}
struct frac {
int mo, so;
};
frac add(frac A, frac B) {
int a = A.mo, b = A.so;
int c = B.mo, d = B.so;
frac ans; ans.mo = ans.so = 0; ans.mo = a * d + c * b;
ans.so = b * d;
int G = gcd(ans.mo, ans.so);
ans.mo /= G, ans.so /= G; return ans;
} frac mul(frac A, int B) {
frac ans = A;
ans.mo *= B;
int G = gcd(ans.mo, ans.so);
ans.mo /= G, ans.so /= G;
return ans;
} void print(frac f) {
int a = f.mo, b = f.so;
if(a % b == 0) {
cout << a / b << endl;
return ;
}
int ig = a / b, ss = a % b; int il = divide(ig);//整数部分数位长度
int bl = max(divide(ss), divide(b));//横杠长度
for(int p = 1; p <= il; p++) cout << " ";
cout << ss << endl; cout << ig;
for(int p = 1; p <= bl; p++) cout << "-";
cout << endl; for(int p = 1; p <= il; p++) cout << " ";
cout << b << endl;
}
signed main() {
int n; cin >> n;
frac ans, now;
ans.mo = 1, ans.so = 1;
for(int p = 2; p <= n; p++) {
now.mo = 1, now.so = p;
ans = add(ans, now);
}
ans = mul(ans, n);
print(ans);
}

最新文章

  1. 46-df 显示磁盘空间的使用情况
  2. Win10 Theano Install Guide
  3. VS2010 error C3861: “exit”: 找不到标识符
  4. (C/C++) Interview in English - Threading
  5. 198. House Robber
  6. ASP.NET MVC(一) 什么是Razor
  7. Meth | phpstorm invalid descendent file name
  8. codevs1002搭桥(建图+Prim)
  9. BZOJ 2298 problem a(区间DP)
  10. Python内置函数(44)——len
  11. 大神教你如何解决Linux系统80端口被占用
  12. 20165220Java实验四 Android程序设计
  13. 搭建django
  14. 自助Linux之问题诊断工具strace【转】
  15. dhtmlxtree 节点 展开收缩:新增了直接点 文本内容 也 实现了 展开收缩 功能(并记住了展开、收缩状态)
  16. twisted 源码分析一:reactor 单例
  17. 列表 list 容器类型数据(str字符串, list列表, tuple元组, set集合, dict字典)---&gt;元组 tuple--&gt;字符串 str
  18. CS229笔记:线性回归
  19. 使用gradle的application插件进行Spring-boot项目打包
  20. 用Win32 实现进度条

热门文章

  1. 【Shell案例】【awk、grep、sort、uniq】10、第二列是否有重复
  2. 【Shell案例】【awk匹配、grep查找文件内的字符串】6、去掉空行(删除空行)
  3. 【每日一题】【List与Array互转】【工具类的使用】2021年12月10日-56. 合并区间
  4. python文件名解析---从文件名获得分类类别
  5. React报错之Element type is invalid
  6. 如何优化大场景实时渲染?HMS Core 3D Engine这么做
  7. 基于SqlSugar的开发框架循序渐进介绍(24)-- 使用Serialize.Linq对Lambda表达式进行序列化和反序列化
  8. 温故知新 - 靶机练习-Toppo
  9. HBase详解(04) - HBase Java API使用
  10. 面对集中式缓存实现上的挑战,Redis交出的是何种答卷?聊聊Redis在分布式方面的能力设计