高次数学期望—OSU

OSU!

题目描述

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

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

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

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

输入格式

第一行有一个正整数 \(n\),表示操作个数。接下去 \(n\) 行每行有一个 \([0,1]\)

输出格式

只有一个实数,表示答案。答案四舍五入后保留 \(1\)

样例 #1

样例输入 #1

3 
0.5 
0.5 
0.5

样例输出 #1

6.0

提示

【样例说明】

\(000\) 分数为 \(0\),\(001\) 分数为 \(1\),\(010\) 分数为 \(1\),\(100\) 分数为 \(1\),\(101\) 分数为 \(2\),\(110\) 分数为 \(8\),\(011\) 分数为 \(8\),\(111\) 分数为 \(27\),总和为 \(48\),期望为 \(\dfrac{48}8 = 6.0\)。

\(n \leq 1 \times 10 ^ 5\)。

题解

由于涉及三次方,于是:

\(E(x+1)^3=E(x)^3+3E(x)^2+3E(x)+1\)

这启发我们维护二次幂和一次式的期望进行递推。由于算上这部分期望是第\(x+1\)位为1的情况,所以我们设\(f_i,g_i\)分别表示当第\(i\)位为\(1\)时候所得的一次方和二次方的期望得分,则容易得到:

\[f_i=(f_{i-1}+1)p_i \]

\[g_i=(g_{i-1}+2f_{i-1}+1)p_i \]

则不难递推出答案:设前\(i\)位的期望得分是\(h_i\),则有:

\[h_i=(h_{i-1}+3g_{i-1}+3f_{i-1}+1)p_i+(1-p_i)h_{i-1} \]

得到代码:

#define db double 
int n;
db f,g,h,f1,g1,h1,p;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>p;
		f=(f1+1.0)*p;
		g=(g1+2.0*f1+1.0)*p;
		h=h1+(3.0*g1+3.0*f1+1.0)*p;
		f1=f,g1=g,h1=h;
	}
	printf("%.1f",h);
}