Submission #5375236


Source Code Expand

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

#define REP(i,begin, n) for(int i=begin;i<n;i++)
typedef long long int lli;
typedef pair<int, int> P;

map<lli, lli> fac;

// dp[i][j][k][l]: i個目のサイコロを振った時点で2,3,5がそれぞれj,k,l個使われている確率
double dp[2][201][101][101];

int main() {
    int n;
    lli d;
    cin >> n >> d;

    while(d%2==0){
        d=d/2;
        fac[2]++;
    }
    while(d%3==0){
        d=d/3;
        fac[3]++;
    }
    while(d%5==0){
        d=d/5;
        fac[5]++;
    }
    if(d!=1){
        cout<<0<<endl;
        return 0;
    }

    dp[0][0][0][0] = 1.0;
    int cur = 0;
    int next = 1;
    REP(i, 0, n) {
        REP(j, 0, n*2-1) {
            if (j > 2 * n )
                break;
            REP(k, 0, n) {
                if (j+k > 2*n)
                    break;
                REP(l, 0, n) {
                    if (j+k+l > 2*n)
                        break;
                    // 1
                    dp[next][j][k][l] += dp[cur][j][k][l] * 1 / 6.0;

                    // 2
                    dp[next][j+1][k][l] += dp[cur][j][k][l] * 1 / 6.0;

                    // 3
                    dp[next][j][k+1][l] += dp[cur][j][k][l] * 1 / 6.0;

                    // 4
                    dp[next][j+2][k][l] += dp[cur][j][k][l] * 1 / 6.0;

                    // 5
                    dp[next][j][k][l+1] += dp[cur][j][k][l] * 1 / 6.0;

                    // 6
                    dp[next][j+1][k+1][l] += dp[cur][j][k][l] * 1 / 6.0;
                    dp[cur][j][k][l] = 0;
                }
            }
        }

        swap(cur, next);
    }

        //REP(j, 0, n*2+1) {
        //    REP(k, 0, n+1) {
        //        REP(l, 0, n+1) {
        //            //if (i == n && j >= fac[2] && k >= fac[3] && l >= fac[5]) {
        //                cout << ", j: " << j;
        //                cout << ", k: " << k;
        //                cout << ", l: " << l;
        //                cout << ", dp: " << dp[cur][j][k][l] << endl;
        //            //}
        //        }
        //    }
        //}
    double ans = 0;
    REP(j, fac[2], 201) {
        REP(k, fac[3], 101) {
            REP(l, fac[5], 101) {
                ans += dp[cur][j][k][l];
            }
        }
    }
    cout << ans << endl;
}

Submission Info

Submission Time
Task D - サイコロ
User longtime
Language C++14 (GCC 5.4.1)
Score 4
Code Size 2416 Byte
Status AC
Exec Time 1166 ms
Memory 30848 KB

Judge Result

Set Name All
Score / Max Score 4 / 4
Status
AC × 13
Set Name Test Cases
All 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 90, 91
Case Name Status Exec Time Memory
00 AC 25 ms 13440 KB
01 AC 846 ms 30720 KB
02 AC 598 ms 26496 KB
03 AC 37 ms 13440 KB
04 AC 34 ms 13312 KB
05 AC 1166 ms 30848 KB
06 AC 807 ms 30720 KB
07 AC 665 ms 28544 KB
08 AC 6 ms 8832 KB
09 AC 569 ms 26496 KB
10 AC 1 ms 256 KB
90 AC 4 ms 2304 KB
91 AC 4 ms 4352 KB