概率期望

事件

单位事件、事件空间、随机事件

在一次随机试验 \(E\) 中可能发生但不能再细分的结果被称为单位事件

所有单位事件的集合叫做事件空间,用 \(\Omega\) 表示。比如掷一次骰子,用获得的点数作为单位事件,那么事件空间 \(\Omega=\{1,2,3,4,5,6\}\)

一个随机事件是事件空间 \(\Omega\) 的子集,用大写字母 \(A,B,C…\) 表示。比如掷一次骰子,设随机事件 \(A\) 表示获得的点数大于 \(4\),则 \(A=\{5,6\}\)

事件的计算

因为事件在一定程度上是以集合的含义定义的,因此可以把事件当做集合来看待。

和事件:相当于并集。若干事件中只要有其中之一发生,就算发生了它们的和事件。

积事件:相当于交集。若干事件必须全部发生,才算发生了它们的积事件。

概率

定义

古典定义

如果一个实验满足两个条件:

  • 试验只有有限个基本结果。

  • 试验的每一个基本结果出现的可能性是一样的。

这样的试验便是古典试验。对于古典试验中的事件 \(A\),它的概率的定义为 \(P(A)=\frac{m}{n}\),其中 \(n\) 表示该试验中所有可能出现的基本结果的总数目,\(m\) 表示 \(A\) 事件包含的试验基本结果数。

统计定义

如果在一定条件下进行了 \(n\) 次试验,事件 \(A\) 发生了 \(N_A\) 次,如果随着 \(n\) 的逐渐增大,频率 \(\frac{N_A}{n}\) 逐渐稳定在某一数值 \(p\) 附近,那么数值 \(p\) 称为事件 \(A\) 在该条件下发生的概率,记作 \(P(A)=p\)

公理化定义

\(E\) 为随机试验,\(\Omega\) 为它的样本空间(事件空间)。对于 \(E\) 的每一个事件 \(A\) 赋予了一个实数,记作 \(P(A)\),称为事件 \(A\) 的概率。这里 \(P(A)\) 是一个集合从实数的映射,\(P(A)\) 满足以下公理:

  • 非负性:对于一个事件 \(A\),有概率 \(P(A)\in [0,1]\)

  • 规范性:样本空间的概率值为 \(1\),即 \(P(\Omega)=1\)

  • 可加性:若 \(A\cap B=\varnothing\),则 \(P(A\cup B)=P(A)+P(B)\)

\((\Omega,P)\) 构成的这样的一个系统称为一个概率空间。

计算

广义加法计算公式

对于任意两个事件 \(A,B\)\(P(A\cup B)=P(A)+P(B)-P(A\cap B)\)

条件概率

\(P(B\ |\ A)\) 表示在 \(A\) 发生的前提之下,\(B\) 事件发生的概率。则 \(P(B\ |\ A)=\frac{P(A\cap B)}{P(A)}\),我们通常使用 \(P(AB)\) 来表示事件 \(A\) 和事件 \(B\) 同时发生的概率,所以我们也可以写作 \(P(B\ |\ A)=\frac{P(AB)}{P(A)}\)

乘法公式

\(P(AB)=P(A)\times P(B\ |\ A)=P(B)\times P(A\ |\ B)\)

全概率公式

若事件 \(A_1,A_2,…,A_n\) 构成一组完备的事件且都有正概率,也就是 \(\forall i,j,A_i\cap A_j=\varnothing\)\(\begin{aligned}\sum\limits_{i=1}^nA_i=1\end{aligned}\),有 \(\begin{aligned}P(B)=\sum\limits_{i=1}^nP(BA_i)=\sum\limits_{i=1}^nP(A_i)P(B\ |\ A_i)\end{aligned}\)

这个相当于是一个分类讨论,先按 \(A\) 分类,看 \(B\) 在这个条件下多少概率出现。
就好比有短裙和短袖,每种红绿蓝三种颜色的各一件,即,一共 \(6\) 件衣服。
那我穿红色衣服的概率就是,穿红色短袖的概率 \(+\) 穿红色短裙的概率。

贝叶斯定理

\(P(B_i\ |\ A)=\dfrac{P(B_iA)}{P(A)}=\dfrac{P(B_i)\times P(A\ |\ B_i)}{\begin{aligned}\sum\limits_{j=1}^nP(B_j)P(A\ |\ B_j)\end{aligned}}\)

随机变量

形式化的说,就是一个样本空间 \(\Omega\) 到实数集 \(R\)\(R\) 的子集的映射 \(X\),即函数 \(f:\Omega \rightarrow R\) 是一个随机变量。如果 \(X(A)=\alpha\),可以直观理解为:当随机试验 \(E\) 取结果 \(A\) 时,该随机变量取值 \(\alpha\)

可以认为这事对 \(\Omega\) 的一种划分,把 \(f(X)\) 相同的 \(X\) 划分到了一起的一种方法。

由此也可以看到,\(X(A)=\alpha\) 也对应这一个能实现该命题的单位时间集合,因此它也是一种事件,于是也有与之对应的概率 \(P(X=\alpha)\)

独立性

直观的说,我们说两个事件独立,当它们在某种意义上互不影响。例如,一个人的出生日期和他的性别,两件事情是独立的。父母的行为和孩子的行为,这两件事就不是独立的,应为某种意义上父母的行为会影响孩子的行为举止。

数学中的独立性与这种直观理解大体相似,但不尽相同。

随机事件的独立性

我们称两个事件 \(A,B\) 独立,当 \(P(A\cap B)=P(A)\times P(B)\)

我们称若干个事件 \(A_1,A_2,…,A_n\) 互相独立,当对于其中的任意一个子集,该子集中的事件同时发生的概率,等于其中每个时间发生的概率的乘积,形式化的说,就是:\(\begin{aligned}P(\bigcap\limits_{E\in T}E)=\prod\limits_{E\in T}P(E)\end{aligned},\forall T\in{A_1,A_2,…,A_n}\)

由此可见,若干随机变量的两两独立和互相独立是不同的概念。

假如说是三个事件 \(A,B,C\),两两独立需要满足 \(P(AB)=P(A)\times P(B),P(BC)=P(B)\times P(C),P(AC)=P(A)\times P(C)\),而互相独立不仅要满足这个,还要满足 \(P(ABC)=P(A)\times P(B)\times P(C)\)

可能有些人就要问了,满足了前三个不应该就满足了最后一个了吗?这里我们举两个经典的例子:

第一种:两两成立另一个一定成立

假如我们从 \(2,3,5,30\) 这四个数中抽取一个数字。

\(A,B,C\) 分别表示表示事件抽到的数是 \(2,3,5\) 的倍数,那么 \(P(A)=\dfrac{1}{2},P(B)=\dfrac{1}{2},P(C)=\dfrac{1}{2}\)

\(P(AB)=\dfrac{1}{4}=P(A)\times P(B)\)

\(P(AC)=\dfrac{1}{4}=P(A)\times P(C)\)

\(P(BC)=\dfrac{1}{4}=P(B)\times P(C)\)

所以 \(A,B,C\) 这三个事件两两独立。

但是 \(P(ABC)=\dfrac{1}{4}\ne P(A)\times P(B)\times P(C)\)

\(A,B,C\) 这三个事件不互相独立,因为事件 \(A,B\) 或事件 \(B,C\) 或事件 \(A,C\) 同时发生的时候,只会抽到 \(30\),它同时是 \(2,3,5\) 的倍数。当同时满足其中两个的时候,另外一个一定满足。

第二种:两两成立另一个一定不成立

掷两次六面骰子,点数分别为 \(1,2,3,4,5,6\) 且等概率出现,记事件 \(A,B,C\) 分别为第一个骰子为奇数、第二个骰子为奇数、两个骰子的点数之和为奇数。

那么 \(P(A)=P(B)=P(C)=\dfrac{1}{2}\)

\(P(AB)=P(AC)=P(BC)=\dfrac{1}{4}\)

\(P(ABC)=0\)

此时三个事件两两独立但是不互相独立,而且当某两个事件满足时,一定不满足第三个事件。

随机变量的独立性

我们用 \(I(X)\) 表示随机变量 \(X\) 的取值范围,即值域。即,如果把 \(X\) 看做一个映射,\(I(X)\) 表示它的值域。

我们称两个随机变量 \(X,Y\) 独立,当 \(P((X=\alpha)\cap (Y=\beta))=P(X=\alpha)\times P(Y=\beta),\forall \alpha\in I(X),\beta \in I(Y)\)

我们称若干随机变量 \(X_1,X_2,…,X_n\) 互相独立,当取任意一组值得概率等于每个 \(X_i\) 取到对应值的概率的乘积。即 \(\begin{aligned}P(\bigcap\limits_{i=1}^nX_i=F_i)=\prod\limits_{i=1}^nP(X_i=F_i)\end{aligned},\forall F_i\in I(X_i)\)

同理,若干随即变量两两独立和互相独立是不同的概念。

期望

定义

如果一个随机变量的取值个数有限(比如一个表示骰子示数的随机变量),或可能的取值可以一一列举出来(比如取值范围为全体正整数),则它称为离散型随机变量。

形式化地说,一个随机变量被称为离散型随机变量,当它的值域大小有限或者为可列无穷大。

一个离散性随机变量 \(X\) 的数学期望是其每个取值乘以该取值对应概率的总和,记为 \(E(X)\)

\(\begin{aligned}E(X)=\sum\limits_{\alpha\in I(X)}(\alpha\times P(X=\alpha))=\sum\limits_{\omega\in \Omega}(X(\omega)\times P(\omega))\end{aligned}\)

性质

  • 全期望公式:\(E(Y)=E(E(Y\ |\ X))\)。对于离散型随机变量为:\(\begin{aligned}E(Y)=\sum\limits_{\alpha\in I(X)}(P(X=\alpha)\times E(Y|(X=\alpha)))\end{aligned}\)。其中 \(E(Y\ |\ A)\) 是在 \(A\) 成立的条件下 \(Y\) 的期望。

  • 期望的线性性:对于任意两个随机变量 \(A,B\)不要求互相独立),有 \(E(X+Y)=E(X)+E(Y)\),且有 \(E(aX+bY)=aE(X)+bE(Y)\)\(a,b\) 为任意标量。可直观理解为和的期望等于期望的和。

  • 期望的积:当两个随机变量 \(A,B\) 相互独立时,有 \(E(XY)=E(X)E(Y)\)

常用套路以及技巧

技巧一

\(0<x<1\) 是,我们有:

\(\begin{aligned}\sum\limits_{i=0}^nx^i=\dfrac{1-x^{n+1}}{1-x}\end{aligned}\)

对于 \(n\rightarrow \infty\) 时,\(\begin{aligned}\sum\limits_{i=0}^{\infty}=\dfrac{1}{1-x}\end{aligned}\)

技巧二

期望的线性性,即对于任意两个随机变量 \(A,B\)(不要求互相独立),有 \(E(X+Y)=E(X)+E(Y)\)

技巧三

前缀和技巧:对于离散变量,\(P(X=k)=P(X\le k)-P(X\le k-1)\)

小例题1

结论:概率为 \(p\) 的事件期望 \(\dfrac{1}{p}\) 次后发生。

你:这不显然吗?我:&……()¥&%……&¥

先举一个显然的例子:你掷一个骰子,你想掷到 \(6\),概率为 \(\dfrac{1}{6}\),那你不就是期望掷 \(6\) 次得到吗?数学推理:

设成功的次数为 \(X\)

\(\begin{aligned}E(X) & = \sum\limits_{i}E(X=i) \\ & = \sum\limits_{i}P(X=i)\times i \\ & = \sum\limits_{i}(P(X\ge i)-P(X\ge i+1))\times i \\ & = \sum\limits_{i}((1-p)^{i-1}-(1-p)^i)\times i\\ & = [(1-p)^0-(1-p)]+[(1-p)-(1-p)^2]\times 2+[(1-p)^2-(1-p)^3]\times3+…\\ & = \sum\limits_{i=0}^{\infty}(1-p)^i\\ & = \dfrac{1}{1-(1-p)}\\ & = \dfrac{1}{p}\end{aligned}\)

如果你还是不懂得话,你可以自己模拟一下这个过程。

小例题2

\(n\) 个随机变量 \(X_{1,2,…,n}\),每一个随机变量都从 \([1,S]\) 中取一个整数,求 \(\text{max}(X_{1,2,…,n})\) 的期望。

\(\begin{aligned}E(\text{max}) & =\sum\limits_{i=1}^SP(\text{max}=i)\times i \\ & =\sum\limits_{i=1}^S(P(\text{max}\le i)-P(\text{max}\le i-1))\times i\\ & =\sum\limits_{i=1}^S(\frac{i^n}{S^n}-\frac{(i-1)^n}{S^n})\times i\end{aligned}\)

概率期望 DP

一般情况下,解决问题一般有两种方法,一种是顺推(知道初始状态),一种是逆推(知道结束状态),如果定义的状态转移方程存在后效性问题,还需要用到高斯消元来优化。概率 \(\text{DP}\) 也会结合其他知识进行考察,例如状态压缩,树上进行 \(\text{DP}\) 转移等。

\(1.\) P4316 绿豆蛙的归宿

\(f_x\) 表示 \(x\) 到终点的期望路径长度。易得 \(f_n=0\),故采用逆推。因此我们反向建边。利用拓扑排序依次处理。

易得对于一条路径(反向建边之后) \(x\to y\),我们有 \(f_y=f_y+\frac{1}{s_x}\times (dis(x\to y)+f_x)\)

\(s_x\) 表示反向建边前的路径,即原路径中 \(x\) 的出度。

由于期望的线性性,因此我们每一个到达 \(y\) 的路径求出期望后直接加和即可。

阻拦在眼前的,统统打碎就行了。
#include <bits/stdc++.h>
#define N 200005

using namespace std;

struct Edge{int next,to,dis;}edge[N];
int head[N],cnt;
void add(int from,int to,int dis){
	edge[++cnt] = (Edge){head[from],to,dis};
	head[from] = cnt;
}
int n,m,Ru[N];double f[N],sum[N];
queue < int > q;

double bfs(){
	q.push(n);
	while(!q.empty()){
		int x = q.front();q.pop();
		for(int i = head[x];i;i = edge[i].next){
			int y = edge[i].to;
			f[y] += (f[x] + edge[i].dis) / sum[y];
			Ru[y] --;if(!Ru[y]) q.push(y);
		}
	}
	return f[1];
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i = 1,u,v,w;i <= m;i ++){
		scanf("%d%d%d",&u,&v,&w);
		if(u != n) add(v,u,w),Ru[u] ++,sum[u] ++;
	}
	printf("%.2lf",bfs());
	return 0;
}

\(2.\) P1365 WJMZBMR打osu! / Easy

我们令 \(s\)o 的期望个数,\(f_i\) 表示以第 \(i\) 个字符结尾的期望的分。

若当前字符为 x,则 \(f_i=f_{i-1},s=0\)

若当前字符为 o,则 \(f_i=f_{i-1}+(s+1)^2-s^2=f_{i-1}+2\times s+1,s=s+1\)

若当前字符为 ?,如果说这个 ?x,则 \(f_i=f_{i-1},s=0\);如果是 o,则 \(f_i=f_{i-1}+2\times s+1,s=s+1\),由于两个的概率都是 \(0.5\),所以把这两种情况 \(\times 0.5\) 再相加即可,即 \(f_i=f_{i-1}\times 0.5+(f_{i-1}+2\times s+1)\times 0.5,s=(s+1)\times 0.5+0\times 0.5\)

绝对实力面前,不存在任何歪打正着。
#include <bits/stdc++.h>
#define N 300005

using namespace std;

int n;string t;double f[N],s;

int main(){
	scanf("%d",&n);cin >> t;t = " " + t;
	for(int i = 1;i <= n;i ++){
		if(t[i] == 'x') f[i] = f[i - 1],s = 0;
		if(t[i] == 'o') f[i] = f[i - 1] + 2 * s + 1,s += 1;
		if(t[i] == '?') f[i] = 0.5 * (f[i - 1] + 2 * s + 1) + 0.5 * f[i - 1],s = 0.5 * (s + 1) + 0.5 * 0;
	}
	printf("%.4lf",f[n]);
	return 0;
}

\(3.\) Let's Play Osu!

跟上面的题差不多,可以自己思考。

自我之像,犹在镜中。
#include <bits/stdc++.h>
#define N 100005

using namespace std;

double f[N],len,p;int n;

int main(){
	scanf("%d",&n);
	for(int i = 1;i <= n;i ++){
		scanf("%lf",&p);
		f[i] = p * (f[i - 1] + 2 * len + 1) + (1 - p) * (f[i - 1]);
		len = p * (len + 1) + (1 - p) * 0;
	}
	printf("%.6lf",f[n]);
	return 0;
}

\(4.\) P1654 OSU!

也差不多,只不过不光要计算 \(x\) 的期望,还要计算 \(x^2\) 的期望,可以自己思考思考,不会了再看我的解析。

由于 \((x+1)^3-x^3=3x^2+3x+1\),所以我们在过程中维护 \(x^2\) 的期望 \(s2\)\(x\) 的期望 \(s1\),可得 \(f_i=f_{i-1}+p\times(3\times s2+3\times s1+1)\),又因为 \((x+1)^2-x^2=2x+1\),所以 \(s2=p\times(s2+2*s1+1),s1=p\times(s1+1)\)

珍惜痛苦吧,它表示你还活着。
#include <bits/stdc++.h>
#define N 100005

using namespace std;

double f[N],p,len1,len2;int n;

int main(){
	scanf("%d",&n);
	for(int i = 1;i <= n;i ++){
		scanf("%lf",&p);
		f[i] = p * (f[i - 1] + 3 * len2 + 3 * len1 + 1) + (1 - p) * f[i - 1];
		len2 = p * (len2 + 2 * len1 + 1) + (1 - p) * 0;
		len1 = p * (len1 + 1) + (1 - p) * 0;
	}
	printf("%.1lf",f[n]);
	return 0;
}

\(5.\) BZOJ1419 Red is good

感觉这个题有点迷,主要是这个“最有策略”的定义有点迷,其实看了题解之后还是不是很懂。

\(f_{i,j}\) 表示当前考虑了 \(i\) 张红牌,\(j\) 张黑牌的期望值,易得 \(f_{i,j}=\frac{i}{i+j}\times (f_{i-1,j}+1)+\frac{j}{i+j}\times (f_{i,j-1}-1)\)

无形有声,谓之妖鼓;无云而雨,谓之天泣。
#include <bits/stdc++.h>
#define N 5005

using namespace std;

int n,m,op;double f[N][N];

int main(){
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i ++){
		op ^= 1;f[op][0] = i;
		for(int j = 1;j <= m;j ++){
			f[op][j] = max(0.0,i * 1.0 / (i + j) * (f[op ^ 1][j] + 1) + j * 1.0 / (i + j) * (f[op][j - 1] - 1));
		}
	}
	printf("%.6lf",f[op][m] - 0.0000005);
	return 0;
}

\(6.\) P10504 守卫者的挑战

我们令 \(f_{i,j,k}\) 表示完成了 \(i\) 个挑战,赢了 \(j\) 个,当前背包容量为 \(k\) 的概率。

显然,对于背包容量超过 \(n\) 得,我们就把它设成 \(n\) 即可,因为最多只用 \(n\)

对于另一个代码实现,由于背包容量不能为负,所以我们都把他们加上 \(n\)\(n\sim 2n\) 代表正的,\(0\sim m\) 代表负的。

易有 \(\begin{cases}\text{if } (k+a_i< n\times 2)\begin{cases}f_{i,j+1,k+a_i}=f_{i,j+1,k+a_i}+f_{i-1,j,k}\times p_i\\f_{i,j,k}=f_{i,j,k}+f_{i-1,j,k}\times (1-p_i)\end{cases}\ \\ \text{else}\begin{cases}f_{i,j+1,n\times 2}=f_{i,j+1,n\times 2}+f_{i-1,j,k}\times p_i\\f_{i,j,k}=f_{i,j,k}+f_{i-1,j,k}\times (1-p_i)\end{cases}\end{cases}\)

有人寄望于遥远的信仰,有人只相信眼前的力量。
#include <bits/stdc++.h>
#define N 205

using namespace std;

int n,L,K,a[N];
double p[N],ans,f[N][N][N << 1];

int main(){
	scanf("%d%d%d",&n,&L,&K);
	for(int i = 1;i <= n;i ++) scanf("%lf",&p[i]),p[i] /= 100;
	for(int i = 1;i <= n;i ++) scanf("%d",&a[i]);
	f[0][0][min(K,n) + n] = 1;
	for(int i = 1;i <= n;i ++){
		for(int j = 0;j <= i;j ++){
			for(int k = 0;k <= n * 2;k ++){
				if(k + a[i] >= n * 2){
					f[i][j + 1][n * 2] += f[i - 1][j][k] * p[i];
					f[i][j][k] += f[i - 1][j][k] * (1 - p[i]); 
				}
				else{
					f[i][j + 1][k + a[i]] += f[i - 1][j][k] * p[i];
					f[i][j][k] += f[i - 1][j][k] * (1 - p[i]);
				}
			}
		}
	}
	for(int i = L;i <= n;i ++){
		for(int j = n;j <= n * 2;j ++){
			ans += f[n][i][j];
		}
	}
	printf("%.6lf",ans);
	return 0;
}

\(7.\) P1297 [国家集训队] 单选错位

易得,只有两个相邻的题答案一样的时候才能答对一道题。

通过自己模拟推理可得,两者之间答案一样的概率就是值较大的倒数。

平凡只是一座仁慈的孤岛,未知与疯狂才是这个世界的底色。
#include <bits/stdc++.h>
#define N 10000007

using namespace std;

int n,A,B,C,a[N];double ans;

int main(){
	scanf("%d%d%d%d%d",&n,&A,&B,&C,a + 1);
	for(int i = 2;i <= n;i ++) a[i] = ((long long)a[i - 1] * A + B) % 100000001;
	for(int i = 1;i <= n;i ++) a[i] = a[i] % C + 1;a[0] = a[n];
	for(int i = 0;i < n;i ++) ans += 1.0 / max(a[i],a[i + 1]);
	printf("%.3lf",ans);
	return 0;
}

\(8.\) FAVDICE - Favorite Dice

有两种方法:

方法一:假设我们手上一共有 \(i-1\) 中不同的数,那我们选择到一个新的数的概率为 \(\dfrac{n-i+1}{n}\),那么根据上面的小例题 \(1\) 可以知道选择到一个新的数的期望为 \(\dfrac{n}{n-i+1}\),那么总期望为 \(\begin{aligned}\sum\limits_{i=1}^n\dfrac{n}{n-i+1}=\sum\limits_{i=1}^n\dfrac{n}{i}\end{aligned}\)

方法二:递推

\(f_i\) 表示当前已经选了 \(i\) 种数,还需要选到 \(n\) 种数的期望。那么初始 \(f_n=0\),我们需要求出 \(f_0\)

对于和之前的点数一样,则 \(f_i=\dfrac{i}{n}\times (f_i+1)\)

对于和之前的点数不一样,则 \(f_i=\dfrac{n-i}{n}\times (f_{i+1}+1)\)

两种情况都加 \(1\) 是因为你掷一次骰子本身就需要 \(1\) 次。

那么 \(f_i=\dfrac{n-i}{n}\times f_{i+1}+\dfrac{i}{n}\times f_i+1\)

那么 \(\dfrac{n-i}{n}\times f_i=\dfrac{n-i}{n}\times f_{i+1}+1\)

那么 \(\begin{aligned}f_i=f_{i+1}+\dfrac{n}{n-i}=f_n+\sum\limits_{j=1}^{n-i}\dfrac{n}{n-i+j+1}\end{aligned}\)

所以 \(\begin{aligned}f_0=\sum\limits_{j=1}^n\dfrac{n}{n-j+1}=\sum\limits_{j=1}^n\dfrac{n}{j}\end{aligned}\)

(你所接触的,只是冰山一角……)畏惧与逃避从不是我的信条。
#include <bits/stdc++.h>

using namespace std;

int T;double ans,n;

int main(){
	scanf("%d",&T);while(T --){
		scanf("%lf",&n);ans = 0;
		for(int i = 1;i <= n;i ++) ans += (n * 1.0 / i);
		printf("%.2lf\n",ans);
	}
	return 0;
} 

\(9.\) P3802 小魔女帕琪

我们先考虑前 \(7\) 个触发一次终极魔法的概率:

\(N=a_1+a_2+a_3+a_4+a_5+a_6+a_7\)

假设我们按顺序取 \(a_1,a_2,…,a_7\),则 \(P=\dfrac{a_1}{N}\times \dfrac{a_2}{N-1}\times \dfrac{a_3}{N-2}\times \dfrac{a_4}{N-3}\times \dfrac{a_5}{N-4}\times \dfrac{a_6}{N-5}\times \dfrac{a_7}{N-6}\)

那么不按顺序取,就乘上 \(1-7\) 的全排列 \(7!\) 就可以,即 \(P=7 !\times \dfrac{a_1}{N}\times \dfrac{a_2}{N-1}\times \dfrac{a_3}{N-2}\times \dfrac{a_4}{N-3}\times \dfrac{a_5}{N-4}\times \dfrac{a_6}{N-5}\times \dfrac{a_7}{N-6}\)

对应期望也就等于概率的数值。

我们考虑第 \(2\)\(8\) 个触发一次终极魔法的概率:

假设我们第一个取得 \(a_1\),那么如果我们按顺序取 \(P=\dfrac{a_1}{N}\times \dfrac{a_2}{N-1}\times \dfrac{a_3}{N-2}\times \dfrac{a_4}{N-3}\times \dfrac{a_5}{N-4}\times \dfrac{a_6}{N-5}\times \dfrac{a_7}{N-6}\times \dfrac{a_1-1}{N-7}\),同样我们也要乘上 \(7!\)

假设我们第一个取得 \(a_2\),那么如果我们按顺序取 \(P=\dfrac{a_2}{N}\times \dfrac{a_1}{N-1}\times \dfrac{a_3}{N-2}\times \dfrac{a_4}{N-3}\times \dfrac{a_5}{N-4}\times \dfrac{a_6}{N-5}\times \dfrac{a_7}{N-6}\times \dfrac{a_2-1}{N-7}\),同样我们也要乘上 \(7!\)

以此类推。

我们发现,这些最后一项的和 \(\sum\limits_{i=1}^7\dfrac{a_i-1}{N-7}=1\),所以第 \(2\)\(8\) 个触发一次终极魔法的概率也为 \(P=7 !\times \dfrac{a_1}{N}\times \dfrac{a_2}{N-1}\times \dfrac{a_3}{N-2}\times \dfrac{a_4}{N-3}\times \dfrac{a_5}{N-4}\times \dfrac{a_6}{N-5}\times \dfrac{a_7}{N-6}\)。期望等于对应概率数值。

因此任意连续 \(7\) 个构成的终极魔法的期望一样,于是 \(E=(N-6)\times P=7 !\times \dfrac{a_1}{N}\times \dfrac{a_2}{N-1}\times \dfrac{a_3}{N-2}\times \dfrac{a_4}{N-3}\times \dfrac{a_5}{N-4}\times \dfrac{a_6}{N-5}\times a_7\)

(迷雾将会覆盖世界……)刺破伪装,窥见真相!
#include <bits/stdc++.h>
#define N 10

using namespace std;

double a[N],ans,n;

int main(){
	for(int i = 1;i <= 7;i ++) scanf("%lf",&a[i]),n += a[i];
	ans = 5040 * a[1] * a[2] * a[3] * a[4] * a[5] * a[6] * a[7] / (n * (n - 1) * (n - 2) * (n - 3) * (n - 4) * (n - 5));
	printf("%.3lf",ans);
	return 0;
} 

\(10.\) Ilya and Escalator

首先我们要计算出在 \(T\) 秒的时候电梯上 \(0-n\) 个人每种情况出现的概率,然后再计算期望。

\(f_{i,j}\) 表示在第 \(i\) 秒电梯上有 \(j\) 个人得概率。

显然,\(f_{0,0}=1\)

我们很容易可以得出转移方程 \(f_{i,j}=p\times f_{i-1,j-1}+(1-p)\times f_{i-1,j}\)

当然我们也要考虑一些特殊的情况:

对于 \(j=0\) 的情况,\(f_{i,0}=(1-p)\times f_{i-1,0}\)

对于 \(j=n\) 的情况,\(f_{i,n}=p\times f_{i-1,n-1}+f_{i-1,n}\)。因为如果电梯里已经有了 \(n\) 个人,那么一定有 \(100\%\) 的概率还是 \(n\) 个人。

星辰的宿命,终究无法被改变。
#include <bits/stdc++.h>
#define N 2005

using namespace std;

double n,p,f[N][N],ans;int t;

int main(){
	scanf("%lf%lf%d",&n,&p,&t);
	f[0][0] = 1;
	for(int i = 1;i <= t;i ++){
		for(int j = 0;j <= n;j ++){
			if(j == 0) f[i][j] = (1 - p) * f[i - 1][j];
			else if(j == n) f[i][j] = p * f[i - 1][j - 1] + f[i - 1][j];
			else f[i][j] = p * f[i - 1][j - 1] + (1 - p) * f[i - 1][j];
		}
	}
	for(int i = 1;i <= n;i ++) ans += f[t][i] * i;
	printf("%.6lf",ans);
	return 0;
} 

\(11.\) Bag of mice

\(f_{i,j}\) 表示袋子里有 \(i\) 个白鼠,\(j\) 个黑鼠,公主赢得概率。边界为 \(f_{i,0}=1\)

考虑所有公主会赢的情况:

公主抓到了一只白鼠,则公主赢。公主赢的概率为 \(\dfrac{i}{i+j}\)

公主抓到了一只黑鼠,龙抓到了一只白鼠,则龙赢。公主赢得概率为 \(0\)

公主抓到了一只黑鼠,龙抓到了一只黑鼠,跑出来一只黑鼠,然后公主在剩下的鼠里面抓到一只白鼠。概率为 \(\dfrac{j}{i+j}\times \dfrac{j-1}{i+j-1}\times \dfrac{j-2}{i+j-2}\times f_{i,j-3}\)。这种情况要判断 \(j\) 是否大于等于 \(3\)

公主抓到了一只黑鼠,龙抓到了一只黑鼠,跑出来一只白鼠,然后公主在剩下的鼠里面找到一支白鼠。概率为 \(\dfrac{j}{i+j}\times \dfrac{j-1}{i+j-1}\times \dfrac{i}{i+j-2}\times f_{i-1,j-2}\)。这种情况要判断 \(i\) 是否大于等于 \(1\)\(j\) 是否大于等于 \(2\)

这几种情况累加即可。

在这个世界,有一束光就能给任何人照亮。
#include <bits/stdc++.h>
#define N 1005

using namespace std;

double w,b,f[N][N];

int main(){
	scanf("%lf%lf",&w,&b);
	for(int i = 1;i <= w;i ++) f[i][0] = 1;
	for(double i = 1;i <= w;i ++){
		for(double j = 1;j <= b;j ++){
			int x = i,y = j;
			f[x][y] += i / (i + j);
			if(j >= 3) f[x][y] += (j / (i + j)) * ((j - 1) / (i + j - 1)) * ((j - 2) / (i + j - 2)) * f[x][y - 3];
			if(j >= 2 and i >= 1) f[x][y] += (j / (i + j)) * ((j - 1) / (i + j - 1)) * (i / (i + j - 2)) * f[x - 1][y - 2];
		}
	}
	printf("%.9lf",f[int(w)][int(b)]);
	return 0;
} 

\(12.\) Jon and Orbs

\(13.\) P6835 [Cnoi2020] 线形生物

\(14.\) P3750 [六省联考 2017] 分手是祝愿

posted @ 2024-05-24 16:58  Joy_Dream_Glory  阅读(77)  评论(0编辑  收藏  举报