洛谷P3802 小魔女帕琪 题解 概率/期望

题目连接:https://www.luogu.com.cn/problem/P3802

题目大意:

\(a_1\)\(1\)\(a_2\)\(2\)\(\cdots\)\(a_7\)\(7\),现在要将这些数拼成一个序列,问:序列中出现连续的 \(7\) 个数都不同的期望次数?

解题思路(参考自 https://www.luogu.com.cn/blog/orangebird/solution-p3802):

\(n = \sum a_i\)

对于每一位 \(i\) ,从 \(i\) 开始的连续 \(7\) 位值都不同的概率是

\[7! \times \frac{a_1}{n} \times \frac{a_2}{n-1} \times \frac{a_3}{n-2} \times \frac{a_4}{n-3} \times \frac{a_5}{n-4} \times \frac{a_6}{n-5} \times \frac{a_7}{n-6} \]

因为一共存在 \(n-6\) 个这样的位置 \(i\) ,所以在乘以 \(n-6\) 得到答案为:

\[7! \times \frac{a_1}{n} \times \frac{a_2}{n-1} \times \frac{a_3}{n-2} \times \frac{a_4}{n-3} \times \frac{a_5}{n-4} \times \frac{a_6}{n-5} \times a_7 \]

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
double a[8], n, ans = 1;
int main() {
    for (int i = 1; i <= 7; i ++) {
        scanf("%lf", a+i);
        ans *= i * a[i];
        n += a[i];
    }
    for (int i = 0; i < 6; i ++)
        ans /= n-i;
    printf("%.3lf\n", ans);
    return 0;
}
posted @ 2020-02-04 19:05  quanjun  阅读(105)  评论(0编辑  收藏  举报