P4550 收集邮票 与 灵异的期望
考前复习一下期望相关知识,这题的期望还是很巧妙的。
设 \(f_{i}\) 表示已经买到了 \(i\) 张不同的邮票的期望步数,\(g_{i}\) 表示表示已经买到了 \(i\) 张不同的邮票的期望花费;\(h_{i}\) 表示已经买到了 \(i\) 张不同的邮票、想买下剩下邮票的期望步数,\(y_{i}\) 表示表示已经买到了 \(i\) 张不同的邮票、想买下剩下邮票的期望花费。
1. 分析性质直接推
我们可以得到一些好玩的式子们,有一些是对的,有一些是错的:
\]
这个式子是对的,为什么呢?我抽到新邮票的概率是 \(\frac{n-i+1}{n}\),那么抽到新邮票的期望次数就是 \(\frac{n}{n-i+1}\)。上述式子甚至可以写成 $ f_n = \sum\limits { \frac{1}{i} } $。
\]
这个式子显然是错的。为什么呢?有两种解释方法,一是每种 \(f_n\) 的取值的贡献不是一样的,不满足线性性;也可以看做是 \(\mathbb{E}(x^2)\) 作为不独立的两个变量相乘,不具有线性性。
\]
这个式子又是对的了,(我也不知道为什么它是对的,目前 lzy 大佬正在证明它)。这个成立就能得到一些很好玩的式子,比如 $ f_{n} = \sum\limits_{i=1}^{n}(\frac{n}{i} \sum\limits_{j=1}^{i}(\frac{n}{i})) $。
2. 用无穷级数直接表示最终答案
众所周知 \(\mathbb{E}(x) = \sum\limits x_iP_i\),于是我们可以直接表示出最终的答案:
\]
其中 \(\frac{i+i^2}{2}\) 是贡献,右边的是概率;概率等于合法情况数除以总情况数,会发现合法情况数就是一个不定方程正整数解的个数的形式,总情况数简单,于是就有了上述式子。
但是这个式子其实没有什么用,一个是精度无法接受,一个是要计算到极高的项才能保证精度,\(n=10^4\) 时大概在 \(4 \times 10^8\) 这样。
更误:这个东西似乎不能等价于不定方程,因为 \(n\) 个物品是两两不同的,所以应该用第二类斯特林数乘以 \((n-1)!\) (乘以阶乘是因为集合也有序),得到
\]
3. 方程法解决递归型期望
\]
这个来源于分类讨论,两种情况分别讨论一下,移项一下就能得到递推式。
\]
和上面的方程的来源是一样的,但是需要用到费用提前计算——\(h_i+1\) 的含义是替后面的提前加上。但这个式子还是有一些难以解释通的地方,为什么递归下去后每次提前计算的贡献是相同的?那不是成了平行四边形吗?这个方法使得期望满足了线性性——竖着我统计没有线性性,横过来看就能巧妙地去掉乘积项,就拥有了线性性。
更为不严谨的方程: 设买了 \(x\) 次邮票,答案就是 \(\frac{x+x^2}{2}\)。设 \(w_i\) 表示已经买到了 \(i\) 种邮票、要买剩下的的邮票的次数平方的期望(注意和期望的平方的区别),那么可以得到
\]
于是答案就是 \(\frac{h_0 + w_0}{2}\)。但是——这么做是有问题的——因为默认了平方的期望等于期望的平方!但是,他居然能过!错的做法能过,说明过的做法都是错的,细思极恐啊!
4. 一个极尽严谨的方法
注意到上面所有东西不严谨的地方在于在变量不独立的情况下使用了乘积的期望等于期望的乘积,可能只是这题它恰好是对的,但不见得下一回它会对。那我们就把乘法的步骤替换成无穷级数求和就行了。
考虑我要买到第 \(i\) 种邮票,若这次我花了 \(1\) 步,那期望的花费是 \(f_{i-1} + 1\);如果花了 \(i\) 步,期望花费是 \(f_{i-1} + 1 + f_{i-1} + 2\) 元......(期望在加法上满足线性性,不管它独不独立。),\(k\) 步的期望花费是 \(kf_{i-1} + \frac{k+k^2}{2}\)(这个地方可以运用乘法是因为这个是取值的乘积,而不是期望的乘积),走 \(k\) 步的概率是 \((\frac{i-1}{n})^{k-1} \times \frac{n-i+1}{n}\),于是得到贡献函数 \(d(i)=g(i)-g(i-1)\) 满足
\]
我相信它化简出来的结果恰好等于 \(\frac{n}{n-i+1}f_{i}\),但是这里篇幅有限,留给读者,证明又繁又难,读者自证又烦又南。
关于随机数
const int maxn = 1e5 + 1e2;
bool vis[maxn]; int n = 31;
unsigned int sd = 233;
inline unsigned int rd()
{
return sd ^= sd >> 13, sd ^= sd << 17, sd ^= sd >> 5;
}
int main()
{
int cnt = 0;
long double tot = 0;
while (true)
{
cnt++;
for (int i = 1; i <= n; i++) vis[i] = 0;
int tmp = 0, t = 0;
while (tmp < n)
{
tot += ++t;
int now = rd() % n + 1;
tmp += !vis[now]; vis[now] = true;
}
if (cnt % 1000000 == 0)
{
cout << cnt << " " << tot / cnt << endl;
}
}
return 0;
}
这是一份用于随机检验的代码,但是会发现收敛后依然跟答案相差很大——事实证明,这是个检验随机数性能的好方法,我们上面代码中的 rd 函数就比 C++ STL::rand 来得与数学解接近的多得多。
P4550 收集邮票 与 灵异的期望的更多相关文章
- P4550 收集邮票
P4550 收集邮票 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由 ...
- 洛谷P4550 收集邮票(概率期望)
传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...
- bzoj1426 (洛谷P4550) 收集邮票——期望
题目:https://www.luogu.org/problemnew/show/P4550 推式子……:https://blog.csdn.net/pygbingshen/article/detai ...
- [P4550] 收集邮票 - 概率期望,dp
套路性地倒过来考虑,设\(f[i]\)表示拥有了\(i\)种票子时还需要多少次购买,\(g[i]\)表示还需要多少钱 推\(g[i]\)递推式时注意把代价倒过来(反正总数一定,从顺序第\(1\)张开始 ...
- P4550 收集邮票-洛谷luogu
传送门 题目描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢 ...
- Luogu P4550 收集邮票
题目链接:Click here Solution: 本题直接推价格似乎很难,考虑先从购买次数入手 设购买次数\(g(i)\)为当前有\(i\)种不同的邮票,要买到\(n\)种的期望购买次数 可以由期望 ...
- [洛谷P4550]收集邮票
题目大意:有$n(n\leqslant10^4)$个物品,第$i$次会从这$n$个物品中随机获得一个,并付出$i$的代价,问获得所有的$n$个物品的代价的期望. 题解:令$f_i$表示现在已经获得了$ ...
- 【BZOJ-1426】收集邮票 概率与期望DP
1426: 收集邮票 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 261 Solved: 209[Submit][Status][Discuss] ...
- 【BZOJ1426】收集邮票 期望
[BZOJ1426]收集邮票 Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的, ...
随机推荐
- VS Code Remote SSH设置
本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...
- Java基础之原生JDBC操作数据库
前言 日常开发中,我们都习惯了使用ORM框架来帮我们操作数据库,本文复习.记录Java如何使用原生JDBC操作数据库 代码编写 封装几个简单方法 find查询方法 findOne查询方法 update ...
- cf13C Sequence(DP)
题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...
- SkyWalking部署及.Net Core简单使用
SkyWalking官方网站非常详细,以下只是本人学习过程的整理 一.SkyWalking简介 1.概念 SkyWalking是分布式系统的应用程序性能监视工具,专为微服务.云原生架构而设计 SkyW ...
- Linux内核 fork 源码分析
内核版本:linux-4.4.18 源码位置:这里 fork相关的代码最终执行的函数为_do_fork(),下面按照顺序分析下_do_fork(): 首先判断是否需要trace(跟踪)这个进程,这一步 ...
- 编译原理中Follow集的求法
经过前阵子的各种百度以及对课本的反复研究,终于弄明白了follow集的求法,下面记录一下! 首先引用龙书里面的一段较为公式化的follow集求法的话: 计算所有非终结符号A的follow(A)集合时, ...
- 【接口】SpringBoot+接口开发(一)
一.接口的简单介绍 1.什么是接口:接口及服务: 2.接口的分类:(1)系统的内部接口;(2)第三方的外部接口; 3.简述接口原理图: 4.接口协议:是指客户端跟服务器之间或者接口与接口间进行的通讯时 ...
- yaml基本用法
简介 YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写.在开发的这种语言时,YAML 的意思其实是:"Yet ...
- 『学了就忘』Linux基础命令 — 36、查看系统痕迹相关命令
目录 1.w命令 2.who命令 3.last命令 4.lastlog命令 5.lastb命令 系统中有一些重要的痕迹日志文件,如/var/log/wtmp./var/run/utmp./var/lo ...
- [python]基于windows搭建django项目
1.首先我的环境用到的库版本如下,若下载直接pip即可 pip3 install Django==2.0.6pip3 install djangorestframework==3.8.2pip3 in ...