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种邮票中的哪一种是等概率的, ... 
随机推荐
- 每日一题,是否存在(c语言)
			每日一题:1.是否存在 是否存在描述猫咪非常喜欢饼干,尤其是字母饼干.现在,她得到一些字母饼干,她希望选择他们中的一些拼写某些单词. 你的任务是确定她是否可以拼出自己想要的单词. 输入输入包含若干测试 ... 
- Stream中的Collector收集器原理
			前言 Stream的基本操作因为平时工作中用得非常多(也能看到一些同事把Stream操作写得很丑陋),所以基本用法就不写文章记录了. 之所以能把Stream的操作写得很丑陋,完全是因为Stream底层 ... 
- HCNP Routing&Switching之BGP防环机制和路由聚合
			前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ... 
- [no_code][Beta] 中期组内总结
			$( "#cnblogs_post_body" ).catalog() 目前scrum meeting beta阶段目前共7次.在alpha阶段我们博客发布时间比较匆忙,是扣分项, ... 
- [技术博客] 利用SharedPreferences来实现登录状态的记忆功能
			[技术博客] 利用SharedPreferences来实现登录状态的记忆功能 一.SharedPreferences简介 SharedPreferences是Android平台上一个轻量级的存储辅助类 ... 
- OO前三次作业思考(第一次OO——Blog)
			OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ... 
- RabbitMQ处理未被路由的消息
			我们经常使用消息队列进行系统之间的解耦,日志记录等等.但是有时候我们在使用 RabbitMQ时,由于exchange.bindKey.routingKey没有设置正确,导致我们发送给交换器(excha ... 
- 简明教程 | Docker篇 · 其一:基础入门
			了解Docker Docker是什么 Docker是指容器化技术,用于支持创建和使用 Linux 容器,同时Docker也是软件容器平台. 什么是容器(container) 容器是主机上与其他进程隔离 ... 
- .NET 生态系统的蜕变之 .NET 6
			.NET 6 是自.NET 4 框架以来生态系统看到的最大版本更新,虽然.NET Core 是2014年开始非常大的一项重大战略举措,但是.NET 6是真正的具有强大动力的非常重要的版本. 2021年 ... 
- linux tr
			转载:tr命令_Linux tr 命令用法详解:将字符进行替换压缩和删除 (linuxde.net) tr命令 文件过滤分割与合并 tr命令可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字 ... 
