高次数学期望—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);
}