はまやんはまやんはまやん

hamayanhamayan's blog

コンプリート [yukicoder No.567]

https://yukicoder.me/problems/no/567

解説放送

未定

解説

https://yukicoder.me/submissions/203601

dpで解く
dp[i][j] := サイコロをi回投げて6面のうちj面が既に出ている確率

サイコロを既にi回投げて、6面のうちj面が既に出ている場合
新しい面が出る確率は(6 - j) / 6であり、これでdp[i+1][j+1]を更新する
出たことある面が出る確率はj/6であり、これでdp[i + 1][j]を更新する

するとdp[N][6]が答え

int N;
double dp[1010101][10];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;
    dp[0][0] = 1;
    rep(i, 0, N) rep(j, 0, 7) {
        int ok = 6 - j;
        int ng = j;
        dp[i + 1][j + 1] += dp[i][j] * ok / 6;
        dp[i + 1][j] += dp[i][j] * ng / 6;
    }
    printf("%.10f\n", dp[N][6]);
}