概率和期望

想必对于概率,大家都是挺熟悉的,从小学就开始学习

概率定义

  • 概率 : 我们可以简单的理解为 事情发生的可能性
  • 样本空间:事情所在的全集集合

我们也有如下性质,就是对于样本空间的一些事件来说的,我们假设样本空间的事件为 \(A\) ,设 \(P(A)\) 代表的是事件 \(A\) 概率,则有

  • \(0\leq P(A)\leq 1\)
  • \(\sum p(A) = 1\)
  • \(A_1,A_2…\) 是两两独立的事件,那么 \(P(A_1\cup A_2…) = P(A_1) + P(A_2) + …\)

一些性质

  • \(P(\phi) = 0\)
  • 如果 \(A\subset B\) , 则有 \(P(B-A) = P(B) - P(A)\) ,更一般的则有:\(P(B-A)=P(B)-P(AB)\)
  • \(P(A\cup B) = P(A) +P(B) - P(AB)\)

条件概率

定义及其计算式

定义 :在已知 \(B\) 事件发生时事件 \(A\) 发生的概率为 \(P(A|B) = \frac{P(AB)}{P(B)}\)

  • 乘法法则: \(P(AB) = P(A|B) \ast P(B)\)

条件概率性质

  • $P(\phi|A) = 0 $
  • \(B_1,B_2…B_n\) 互不相容,则 \(P(U_{i=1}^{n}B_i|A) = \sum_{i=1}^{n}P(B_i|A)\)
  • \(P(\bar{B}|A) = 1 - P(B|A)\)
  • \(P(B\cup C|A) = P(B|A) + P(C|A) - P(BC|A)\)

期望定义

为什么叫期望呢,就是你在一个样本空间内选择事件,然后每一个事件都有一个权值(扔色子) ,不同的事件对应着不同的权值,然后我们肯定不能只拿小的,我们不乐意(你乐意我不乐意),我们也不可能只拿大的,显然这是不可能(欧皇也没这么欧),所以我们期望能够获得多少的权值。这就叫做期望。

计算式和小性质

  • \(E[f(x)] = \sum f(x)P(X == x)\)
  • 还有一个能够简化计算的,就是 和的期望 等于 期望的和。
  • \(E[c_1 X_1 + c_2X_2+…] = c_1 E(X_1) + c_2E(x_2)+…\)
  • 如果 \(X_1,X_2\) 独立,则有 \(E(X_1X_2)=E(X_1)E(X_2)\)

贝叶斯公式

\(B_1,B_2…B_n\) 为样本空间的划分 , 则有

\[P(B_i |A) = \frac{P(A|B_i)P(B_i)}{\sum_{j=1}^n P(A|B_j) P(B_j)} \]

独立事件

如果 \(P(A)P(B) = P(AB)\) , 那么就有 \(AB\) 事件独立

我们可以认为, \(AB\) 事件无交集

  • 其中不可能事件,必然事件和任何事件都是相互独立的。

\(AB\) 独立的 \(P(B |A) = P(B)\)

三门问题

【description】:

现在有 \(3\) 扇门,门后面有 \(3\) 个物件,可能是一块石头,也可能是一块黄金,现在你打开了一扇门,然后主办方又打开了一扇门,门后面是一块石头,现在你是选择坚持你选择的门,还是选择换一扇门。

【solution】:

换一扇门 : 首先我们要知道一个内幕,那就是,主办方当然知道哪一扇门后面有黄金,但是主办方是不会将黄金翻开的,也就说,主办方只会翻开带有石头的。那么我们显然是有几种可能

我们从左到右分别第 \(1,2,3\) 扇门 ,其中 \(1\) 表示黄金,\(0\) 表示石头

我们假设 \(1\) 号门中有黄金,其中 \(2,3\) 有的只是石头。然后我们开始模拟你选择的过程:

我们运气很好,直接翻开了 \(1\) 号门 ,那么主办方显然随便翻开了 \(2,3\) 门即可。
我们运气不好,选择翻开了 \(2\) 号门,那么这个时候,主办方只能够选择 \(3\) 号门,
我们运气不好,选择翻开了 \(3\) 号门,那么这个时候,主办方只能够选择 \(2\) 号门。

最后这个游戏随机放置 ,我们怎么知道哪一号门有黄金,然后我们只知道,我们选择换门的话,我们能够得到黄金的概率是 \(\frac{2}{3}\) ,但是不换门的概率能够得到黄金的概率却只有 \(\frac{1}{3}\)。所以我们呢选择换一扇门 。

三门问题的别样

这个说是三门问题的别样,但是却和三门问题是没什么联系。

【description】:

现在在小明和小泽面前有三瓶药,其中两瓶是毒药,每个人必须喝一瓶。 但是小泽手速很快,抢了一瓶,立马干了,死了,然后小聪很疑惑,他到底是喝手里这瓶还是另外的一瓶。

【solution】:

换不换一样

我们发现这货很三门问题很像,有一个质的区别,就是三门问题中的主办方知道哪一个黄金,但是他选择的是只能是石头,但这个题不一样,小泽也想活下去,他可能选择了不是毒药的那瓶,但是主办方是绝对不会选择的。然后就一样了。

概率的一个问题

准确的说,是颠覆了我对于概率的认知。

【description】:

小胡站在原点,手里拿着两枚硬币。抛第一枚硬币正面向上的概率为 \(p\) ,第二枚正面向上的概率为 \(q\)

  • 现在小胡开始抛第一枚硬币,每次抛到反面小胡就向 \(x\) 轴正方向走一步,直到抛到正面。
  • 接下来小胡继续抛第一枚硬币,每次抛到反面小胡就向 \(y\) 轴正方向走一步,直到抛到正面。
  • 现在小胡想回来了,于是他开始抛第二枚硬币,如果小胡抛到正面小胡就向 \(x\) 轴的负方向走一步,否则小胡就向 \(y\) 轴的负方向走一步。
  • 现在他在往回走的时候经过原点的概率是多少?

【solution】:

可能分开后有利于理解题意

我可以先告诉你答案为无限无限无限近似于 \(p\)(我们可以认为其就是 \(p\)) ,惊讶吗?我当时被颠覆了 。

我们发现在一开始的两步,我们是可能走遍整个第一象限的,所以我们枚举第一象限的所有点。我们就有到达 \((x,y)\) 这个点的概率为 \((1-p)^x \times p \times (1-p)^y\times p\) 这么个玩意。同时也就是对应上面的过程 \(1,2\) , 那么我们考虑一下过程 \(3\) ,那么我们让 \((x,y)\) 回到 \((0,0)\) 那么我们需要抛 \(x\) 次正面, \(y\) 次反面 , 那么也就是 \(q^x \times (1-q)^y\)
但是我们这里有一个顺序问题,就是 \(x\) 次正面,你怎么抛,那么就有 \(C_{x+y}^{x}\) 的可能,那么我们过程 \(3\) 的概率就是 \(q^x \times (1-q)^y\times C_{x+y}^{x}\) .

那么我们把过程 \(1,2,3\) 综合起来,就是 \((1-p)^x\times p\times (1-p)^y\times p\times q^x\times (1-q)^{y}\times C_{x+y}^{x}\)
由于这个 \(\times\) 长有点像 \(x\) ,所以我们用 \(\ast\) 代替一下

那么答案就是

\[\sum_{x =0}^{\infty}\sum_{y=0}^{\infty}(1-p)^x \ast p \ast (1-p)^y \ast p \ast q^x \ast (1-q)^y\ast C_{x+y}^{x} \]

我们是傻逼,考虑暴力

\[\sum_{x=0}^{\infty}\sum_{y=0}^{\infty}(1-p)^{x+y}\ast p^2 \ast q^x \ast (1-q)^y\ast C_{x+y}^x \]

我们考虑一下换元 我们令 \(t = x + y\) , 然后我们枚举 \(t,x\) , 我们就能得到

\[\sum_{t=0}^{\infty}\sum_{x=0}^{t}(1-p)^t \ast p^2 \ast q^x \ast (1-q)^{t-x} \ast C_{t}^{x} \]

我们有一些项和 \(x\) 无关,我们将其移到前面来。

\[\sum_{t=0}^{\infty}(1-p)^t\ast p^2 \sum_{x=0}^{t} q^x \ast (1-q)^{t-x} \ast C_{t}^{x} \]

我们发现后面其实是二项式定理 。

\[\sum_{t=0}^{\infty}(1-p)^t \ast p^2 (1 - q + q)^t \]

\[\sum_{t=0}^{\infty}(1-p)^t \ast p^2 \]

我们发现 \(p^2\)\(t\) 没关系,提到前面来,就能够得到。

\[p^2 \sum_{t=0}^{\infty}(1-p)^t \]

涉及一个等比数列,后面再说一下,并不打算给出证明,不会

\[p^2 \ast \frac{1 - (1 - p) ^ {\infty}}{1 - (1 - p)} \]

其中 \((1-p)^{\infty}\) 很显然是无限近似于 \(0\) 的,然后就能够得到 \(p^2 \ast \frac{1}{p} = p\)

神奇。

等比数列求和:
因为上面是 \((1-p)^0,(1-p)^1,(1-p)^2\) 之间比值为 \((1-p)\) ,所以是一个等比数列。
因为这里表示太麻烦了,我们用 \(a , 1,n\) 表示
\(\sum_{i = 0}^{n} a^i = \frac{1-a^{n+1}}{1-a}\)

刷矩形

\(description\)】:有一个 \(n\times m\) 格子的矩形,每次随机刷掉一个矩形,问 \(k\) 次之后期望刷掉多少个格子, \(n,m\leq 10^3 , k \leq 100\)
\(solution\)】: 我们有期望的和 = 和的期望,我们就可以将这个问题转化成求解每一个格子的期望,我们发现刷掉的贡献为 \(1\) , 没有刷掉的贡献为 \(0\) , 所以,整个矩形的格子期望值就得到每一个格子的概率之和。

/*
 By : Zmonarch
 知识点 
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <set>
#define int long long 
#define qwq register
#define inl inline 
#define inf 2147483647
const int kmaxn = 1e6 + 10 ;
const int kmod = 998244353 ; 
inline int read() {
	int x = 0 , f = 1 ; char ch = getchar() ; 
	while(!isdigit(ch)) {if(ch == '-') f = - 1 ; ch = getchar() ;} 
	while( isdigit(ch)) {x = x * 10 + ch - '0' ; ch = getchar() ;}
	return x * f ; 
} 
int n , m ; 
double quick(double a , int b) {
	double ret = 1.0 ; 
	while(b) 
	{
		if(b & 1) ret = ret * a ; 
		a = a * a ; 
		b >>= 1 ;
	}
	return ret * 1.0 ; 
}
double P(double a , double b ) {
	double A = 4.0 * a * b * (n * 1.0 - a + 1.0) * (m * 1.0 - b + 1.0) ; 
	double B = 2.0 * (a * (n * 1.0 - a + 1.0) + b * (m * 1.0 - b + 1.0)) ; 
	double C = 1.0 ; 
	return (double)(A - B + C ) / (n * 1.0 * m * 1.0 * n * 1.0 * m) ; 
}
signed main() {
	double ret = 0.0 ; 
	int k = read() ; n = read() , m = read() ; 
	for(qwq double i = 1.0 ; i <= n * 1.0 ; i += 1.0) 
	 for(qwq double j = 1.0 ; j <= m * 1.0 ; j += 1.0) 
	  ret += 1.0 - quick((1.0 - P(i , j)) , k ) ;   
	  //printf("%lf" , ret) ; 
	printf("%.0lf\n" , ret ) ; 
	return 0 ; 
}

神奇的矩形

\(description\)】给出三个行数和列数均为\(N\)的矩阵\(A,B,C\),判断\(A\times B=C\)是否成立。 \(n\leq 10^3\)
\(Solution\)】: 我们随机一个 \(n\times 1\) 的矩阵 \(k\) , 然后让 \(A\times B\times k , C\times k\) 看一下左右边是否相等,其中矩阵虽然不满足交换律,但是它满足结合律,我们可以先让 \(b\times k\) ,然后再和 \(A\) 想乘,所以复杂度是 \(O(n^2)\) 的,可过。

\(Code\)】:

/*
 By : Zmonarch
 知识点
只要是正义的一方,无论手段多么卑鄙都可以被原谅
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <set>
#include <cstdlib>
#define int long long
#define qwq register
#define inl inline
#define inf 2147483647
const int kmaxn = 1e6 + 10 ;
const int kmod = 19260817 ;
inline int read() {
	int x = 0 , f = 1 ; char ch = getchar() ;
	while(!isdigit(ch)) {if(ch == '-') f = - 1 ; ch = getchar() ;}
	while( isdigit(ch)) {x = x * 10 + ch - '0' ; ch = getchar() ;}
	return x * f ;
}
int n ; 
struct Matrix{
	int n , m ; int a[1001][1001] ; 
	Matrix() {n = m = 0 ; memset(a , 0 , sizeof(a));}
};
Matrix operator * (const Matrix &m1 , const Matrix &m2) {
	Matrix m3 ; m3.n = m1.n ; m3.m = m2.m ;
	for(qwq int i = 1 ; i <= m3.n ; i++) 
	 for(qwq int j = 1 ; j <= m3.m ; j++) 
	  for(qwq int k = 1 ; k <= m1.m ; k++) 
	   m3.a[i][j] = (m3.a[i][j] + m1.a[i][k] * m2.a[k][j]) % kmod ; 
	return m3 ; 
}
bool operator == (const Matrix &m1 , const Matrix &m2) {
	if(m1.m != m2.m || m1.n != m2.n) return 0 ; 
	for(qwq int i = 1 ; i <= m1.n ; i++) 
	 for(qwq int j = 1 ; j <= m1.m ; j++) 
	  if(m1.a[i][j] != m2.a[i][j]) return 0 ; 
	return 1 ; 
}
signed main() {
	srand(kmod) ; 
	while(scanf("%lld" , &n) != EOF) 
	{
		Matrix a , b , c , t ; 	t.n = n ; t.m = 1 ;
		a.n = b.n = c.n = a.m = b.m = c.m = n ; 
		for(qwq int i = 1 ; i <= n; i++) 
		 for(qwq int j = 1 ; j <= n ; j++) 
		  a.a[i][j] = read() % kmod ; 
		for(qwq int i = 1 ; i <= n; i++) 
		 for(qwq int j = 1 ; j <= n ; j++) 
		  b.a[i][j] = read() % kmod ; 
		for(qwq int i = 1 ; i <= n; i++) 
		 for(qwq int j = 1 ; j <= n ; j++) 
		  c.a[i][j] = read() % kmod ; 
		int T = 15 ; bool flag = 0 ; 
		while(T--) 
		{
		 
			for(qwq int i = 1 ; i <= n ; i++) t.a[i][1] = rand() % kmod ; 
			if(!(a * (b * t) == c * t)) {flag = 1 ; break ;}
		}
		if(flag) printf("No\n") ; 
		else printf("Yes\n") ;
	}
	return 0 ;
}

OSU!

【description】:

osu是一款群众喜闻乐见的休闲软件。

我们可以把osu的规则简化与改编成以下的样子:

一共有\(n\)次操作,每次操作只有成功与失败之分,成功对应\(1\),失败对应\(0\)\(n\)次操作对应为\(1\)个长度为\(n\)\(01\)串。在这个串中连续的$ X$个\(1\)可以贡献\(X^3\)的分数,这\(X\)\(1\)不能被其他连续的\(1\)所包含。

现在给出\(n\),以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留\(1\)位小数。

【solution】

我们先来考虑贡献的不是 \(x^3\) 而是 \(x\) 的情况,那么就是其中有多少个 \(1\) 就好。

这里直接给出正解: 我们设 \(f_i\) 表示前 \(i\) 个进程完成后末尾有多少个 \(1\) 的期望,那么我们在推导 \(f_{i+1}\) 的时候,$f_{i+1} = (f_{i} + 1 ) * p_{i+1} + 0 * (1 - p_{i+1}) $
然后我们考虑一下贡献为 \(x^2\) 的时候 , \((x+1)^2 = x^2 + 2x + 1 = g_{i-1}+2f_{i-1}+1\) 概率同样为 \(p_{i}\) 我们照猫画虎,就能够得到考虑贡献 \(x^3\) 也是一样的。但是这里注意的是,这里不再是末尾为多少个 \(1\) 的期望值,而是整体的期望值。

【Code】

/*
 By : Zmonarch
 知识点
 只要是正义的一方,无论手段多么卑鄙都可以被原谅
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <set>
#define int long long
#define qwq register
#define inl inline
#define inf 2147483647
const int kmaxn = 1e6 + 10 ;
const int kmod = 998244353 ;
inline int read() {
	int x = 0 , f = 1 ; char ch = getchar() ;
	while(!isdigit(ch)) {if(ch == '-') f = - 1 ; ch = getchar() ;}
	while( isdigit(ch)) {x = x * 10 + ch - '0' ; ch = getchar() ;}
	return x * f ;
}
int n ; 
double f[kmaxn] , g[kmaxn] , h[kmaxn] , p[kmaxn] ; 
signed main() {
	n = read() ; 
	for(qwq int i = 1 ; i <= n ; i++) std::cin >> p[i] ; 
	for(qwq int i = 1 ; i <= n ; i++) 
	{
		f[i] = (f[i - 1] + 1) * p[i] ; 
		g[i] = (g[i - 1] + 2 * f[i - 1] + 1) * p[i] ; 
		h[i] = h[i - 1] + (3 * g[i - 1] + 3 * f[i - 1] + 1) * p[i] ; 
	}
	printf("%.1lf" , h[n]) ;
	return 0 ;
}

posted @ 2021-05-07 16:39  SkyFairy  阅读(297)  评论(0编辑  收藏  举报