学习笔记--概率期望(一些题)

一些公式

概率

P ( A ∪ B ) = P ( A ) + P ( B ) − P ( A ∩ B ) P ( B − A ) = P ( B ) − P ( A ) ( P ( A ) ≤ P ( B ) ) P ( B − A ) = P ( B ) − P ( A ∩ B ) ( ∀ A , B ) P ( A ∣ B ) = P ( A ∩ B ) P ( B ) P ( A B ) = P ( A ) × P ( B ∣ A ) = P ( B ) × P ( A ∣ B ) ( A , B 有 关 联 ) \begin{aligned} & P(A\cup B) = P(A) + P(B) - P(A \cap B) \\ & P(B-A) = P(B) - P(A) \qquad (P(A) \leq P(B)) \\ & P(B-A) = P(B) - P(A \cap B) \qquad (\forall A, B) \\ & P(A\mid B) = \frac{P(A \cap B)}{P(B)} \\ & P(AB) = P(A) \times P(B\mid A) = P(B) \times P(A\mid B) \quad (A,B 有关联) \\ \end{aligned} P(AB)=P(A)+P(B)P(AB)P(BA)=P(B)P(A)(P(A)P(B))P(BA)=P(B)P(AB)(A,B)P(AB)=P(B)P(AB)P(AB)=P(A)×P(BA)=P(B)×P(AB)(A,B)

全概率公式

P ( A ) = ∑ i = 1 n P ( A ∣ H i ) × P ( H i ) P(A) = \sum_{i=1}^n P(A\mid H_i) \times P(H_i) P(A)=i=1nP(AHi)×P(Hi)

贝叶斯定理

P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A\mid B) = \frac{P(A)P(B\mid A)}{P(B)} P(AB)=P(B)P(A)P(BA)

期望

E ( x ) = ∑ i p i x i E ( C ) = C E ( C x ) = C E ( x ) E ( x + y ) = E ( x ) + E ( y ) E ( x y ) = E ( x ) E ( y ) ( x , y 相 互 独 立 ) \begin{aligned} & E(x) = \sum_i p_ix_i \\ & E(C) = C \quad E(Cx) = CE(x) \quad E(x+y) = E(x) + E(y) \\ & E(xy) = E(x)E(y) \qquad (x,y相互独立) \end{aligned} E(x)=ipixiE(C)=CE(Cx)=CE(x)E(x+y)=E(x)+E(y)E(xy)=E(x)E(y)(x,y)

全期望公式

E ( Y ) = E ( E ( Y ∣ X ) ) = ∑ i P ( x = x i ) E ( Y ∣ X = x i ) E(Y) = E(E(Y \mid X)) = \sum_i P(x=x_i)E(Y \mid X = x_i) E(Y)=E(E(YX))=iP(x=xi)E(YX=xi)

题(们)

一、百事世界杯之旅

P1291【SHOI2002】百事世界杯之旅

  设 E i , j E_{i, j} Ei,j 表示总共有 i 个,还有 j 个没有抽到的期望。,我们考虑下一次抽取:有 k n \frac k n nk 的概率抽到我们还没有的,有 n − k n \frac{n-k}n nnk 的概率抽到我们已经抽到的,于是我们可以得到以下的递推式:
E n , k = k n E n , k − 1 + n − k n E n , k + 1 E_{n, k} = \frac k n E_{n,k-1} + \frac{n-k}n E_{n, k} + 1 En,k=nkEn,k1+nnkEn,k+1

  然后稍微移项化简一下,就会变成这样:
E n , k = k n E n , k − 1 + n − k n E n , k + 1 E n , k − n − k n E n , k = k n E n , k = k n E n , k − 1 + 1 E n , k = E n , k − 1 + n k \begin{aligned} & E_{n, k} = \frac k n E_{n,k-1} + \frac{n-k}n E_{n, k} + 1 \\ & E_{n, k} - \frac{n-k}n E_{n, k} = \frac k n E_{n,k} = \frac k n E_{n,k-1} + 1 \\ & E_{n, k} = E_{n, k-1} + \frac n k \end{aligned} En,k=nkEn,k1+nnkEn,k+1En,knnkEn,k=nkEn,k=nkEn,k1+1En,k=En,k1+kn

  又因为我们知道 E 1 , 1 = 1 E_{1,1} = 1 E1,1=1,,所以我们得到通项公式:
E ( x ) = n ∑ i = 1 n 1 i E(x) = n\sum_{i=1}^n\frac 1 i E(x)=ni=1ni1

  代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll n; ll z;
ll p; ll q = 1;

ll gcd(ll a, ll b){	
	return b ? gcd(b, a % b) : a;
}

ll countDigit(ll x){	
	ll ans = 0;
	while(x != 0){	
		ans++; x /= 10;
	}
	return ans;
}

void reduction(){
	for(ll i = 1; i <= n; i++){
		p = p * i + q;
		q = i * q;
		ll d = gcd(min(q, p), max(q, p));
		q /= d; p /= d;
	}
	p *= n;
	z = p / q;
	p %= q;
	ll d = gcd(min(q, p), max(q, p));
	q /= d; p /= d;
}

void print(){
	if(p == 0){	
		printf("%lld", z);
		return;
	}
	for(int i = 1; i <= countDigit(z); i++) printf(" ");
	printf("%lld\n", p);
	printf("%lld", z);
	for(int i = 1;i <= countDigit(q); i++) printf("-");
	printf("\n");
	for(int i = 1; i <= countDigit(z); i++) printf(" ");
	printf("%lld", q);
}

int main(){	
	scanf("%lld", &n);
	reduction();
	print();
}

二、骰子

  题目大意:一个骰子,扔 n 次的点数之和大于 x 的概率。

  首先我们考虑算出扔 n 次点数之和大于 x 的方案数,最后再除以 6 n 6^n 6n 即可。我们设 f i , j f_{i, j} fi,j 表示扔了 i 次,点数之和为 j 的方案数。我们就有:
f i , j = ∑ k = 1 6 f i − 1 , j − k f_{i, j} = \sum_{k=1}^6 f_{i-1,j-k} fi,j=k=16fi1,jk

  所以整个算法就是先 DP 然后最后的答案就是:

a n s = ∑ i = x 6 n f n , i 6 n ans = \frac{\sum_{i = x}^{6n}f_{n,i}}{6^n} ans=6ni=x6nfn,i

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int n = 0; int x = 0;

ll gcd(ll a, ll b){
	return b ? gcd(b, a % b) : a;
}

ll tot = 1; ll ans = 0;
ll f[30][200] = { 0 };
void dp(){
	f[0][0] = 1;
	for(int i = 1; i <= n; i++){
		tot *= 6;
	    for(int j = 1; j <= 6 * i; j++)
		    for(int k = 1; k <= 6; k++)
		        if(j - k >= 0) f[i][j] += f[i-1][j-k];
	}
}

int main(){
	scanf("%d%d", &n, &x);
	dp();
	for(int i = x; i <= 6 * n; i ++) ans += f[n][i];
	ll d = gcd(tot, ans);
	if(ans / d == 0) printf("0\n");
	else if(tot / d == 1) printf("%lld\n", ans / d);
	else printf("%lld/%lld\n", ans / d, tot / d);
	return 0;
}

三、OX 序列

  给定序列,每个位置是 o o o 的概率为 p i p_i pi,为 x x x 的概率是 1 − p i 1 - p_i 1pi。对于一个 o x ox ox 序列,连续 a a a 长度的 o o o 会得到 a 3 a^3 a3 的收益,问最终得到的 o x ox ox 序列的期望收益是多少。

  我们设 f i f_i fi 为某一种具体的放置方法中已经放到第 i i i 位的收益。 x i x_i xi 表示某一种具体的放置方法中从最后一位开始连续的 o o o 的长度。那么我么需要求解的就是 E ( f n ) E(f_n) E(fn)。首先我们很容易知道一个关于 f f f 的递推式:

f i = f i − 1 + ( x i − 1 + 1 ) 3 − x i − 1 3 = f i − 1 + 3 x i − 1 2 + 3 x i − 1 + 1 f_i = f_{i-1} + (x_{i-1} + 1)^3 - x_{i-1}^3 = f_{i-1} + 3x_{i-1}^2 + 3x_{i-1} + 1 fi=fi1+(xi1+1)3xi13=fi1+3xi12+3xi1+1

  那么:

E ( f i ) = E ( f i − 1 ) + 3 E ( x i − 1 2 ) + 3 E ( x i − 1 ) + 1 E(f_i) = E(f_{i-1}) + 3E(x_{i-1}^2) + 3E(x_{i-1}) + 1 E(fi)=E(fi1)+3E(xi12)+3E(xi1)+1

  化成这样之后,我们就可以发先如果我们求出 3 E ( x i − 1 2 ) + 3 E ( x i − 1 ) 3E(x_{i-1}^2) + 3E(x_{i-1}) 3E(xi12)+3E(xi1),这就是一个关于 E ( f ) E(f) E(f) 的递推式。就可以直接求出来。所以我们考虑怎样求出 E ( x i ) E(x_{i}) E(xi) E ( x i 2 ) E(x_{i}^2) E(xi2)。首先处理一个简单一点的:

E ( x i ) = ? \begin{aligned} E(x_{i}) = ? \end{aligned} E(xi)=?

  要知道这个我们首先需要知道 x i x_i xi 的递推式:

{ 第 i 位 o ,    概 率 为 p i ,    x i = x i − 1 + 1 第 i 位 x ,    概 率 为 1 − p i ,    x i = 0 \begin{cases} 第i位o, \; 概率为p_i, \; x_i = x_{i-1}+1 \\ 第i位x, \; 概率为1-p_i, \; x_i = 0 \end{cases} {io,pi,xi=xi1+1ix,1pi,xi=0

  那么:

E ( x i ) = p i × E ( x i − 1 + 1 ) + E ( 1 − p i ) × 0 = p i E ( x i − 1 ) + p i \begin{aligned} E(x_i) = p_i \times E(x_{i-1} + 1 ) + E(1-p_i) \times 0 = p_iE(x_{i-1}) + p_i \end{aligned} E(xi)=pi×E(xi1+1)+E(1pi)×0=piE(xi1)+pi

  这样之后我们也可以用递推解决 E ( x i ) E(x_i) E(xi) 的值。然后考虑 E ( x i 2 ) E(x_i^2) E(xi2) 的值。首先:

{ 第 i 位 o ,    概 率 为 p i ,    x i 2 = ( x i − 1 + 1 ) 2 = x i − 1 2 + 2 x i − 1 + 1 第 i 位 x ,    概 率 为 1 − p i ,    x i 2 = 0 \begin{cases} 第i位o, \; 概率为p_i, \; x_i^2 = (x_{i-1}+1)^2 = x_{i-1}^2 + 2x_{i-1} + 1 \\ 第i位x, \; 概率为1-p_i, \; x_i^2 = 0 \end{cases} {io,pi,xi2=(xi1+1)2=xi12+2xi1+1ix,1pi,xi2=0

  那么:

E ( x i 2 ) = p i E ( x i − 1 2 + 2 x i − 1 + 1 ) + ( 1 − p i ) × 0 = p i E ( x i − 1 2 ) + 2 p i E ( x i − 1 ) + p i \begin{aligned} E(x_i^2) = & p_iE(x_{i-1}^2 + 2x_{i-1} + 1) + (1-p_i) \times 0 \\ = & p_i E(x_{i-1}^2) + 2p_iE(x_{i-1} ) + p_i \end{aligned} E(xi2)==piE(xi12+2xi1+1)+(1pi)×0piE(xi12)+2piE(xi1)+pi

  显然这也是一个递推式,那我们就可以 O ( n ) O(n) O(n) 求出最终答案了。

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100100

int n = 0;

int main(){
    cin >> n;
    double p; double Ef = 0;
    double Ex = 0; double Exx = 0;
    for(int i = 1; i <= n; i++){
        cin >> p;
        Ef += (3 * Exx + 3 * Ex + 1) * p;
        Exx = (Exx + 2 * Ex + 1) * p;
        Ex = (Ex + 1) * p;
    }
    printf("%lf\n", Ef);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值