Project Euler 389 Platonic Dice (概率)

题目链接:

https://projecteuler.net/problem=389

题意:

(T)。

(C)。

(O)。

(D)。

(I)。

(4)位小数。

每个面出现的概率等价。

题解:

可能我学了假的概率论和统计方法...以前不知道Bienaymé formula...可能学了也忘了...不过我们可以查 Wiki...QAQ... https://en.wikipedia.org/wiki/Variance

(n)边形的骰子,掷骰子得到的期望点数可以定义为离散随机变量。

(Var(X) = sum_{i=1}^{6}frac{1}{6}(i-frac{7}{2})^2 = frac{35}{12})。

(X = frac{1}{n}sum_{i=1}^{n}i = frac{n+1}{2})。

(Var(X) = E(X^2) - (E(X)^2) = frac{1}{n}sum_{i=1}^{n}i - (frac{1}{n}sum_{i=1}^{n}i)^2 = frac{(n+1)(2n+1)}{6} -(frac{n+1}{2})^2 = frac{n^2 - 1}{12})。

(Var(I) = Var(E(I|D)) + E(Var(I|D))] = Var(D)E(d)E(d) +Var(d) E(D)) 就可以做出来啦。

代码:

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

int dice[5] = {4,6,8,12,20};

//https://en.wikipedia.org/wiki/Variance

double E(int n)
{
    return (n + 1) / 2.0;
}
double Var(int n)
{
    return (n * n - 1) / 12.0;
}

int main(int argc, char const *argv[]) {
    double e = 0.0 , var = 0.0;
    double ed = 1.0, varsum = 0;
    for(int i = 0; i < 5; i++) {
        e = E(dice[i]);
        var = Var(dice[i]);
        varsum = varsum * e * e + var * ed;
        ed = ed * e;
    }
    printf("%.4f
", varsum);
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.
";
    return 0;
}