結果

問題 No.108 トリプルカードコンプ
ユーザー 👑 rin204
提出日時 2022-07-09 16:41:21
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 163 ms / 5,000 ms
コード長 663 bytes
コンパイル時間 183 ms
コンパイル使用メモリ 82,460 KB
実行使用メモリ 102,044 KB
最終ジャッジ日時 2024-12-31 04:11:47
合計ジャッジ時間 2,496 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 20
権限があれば一括ダウンロードができます

ソースコード

diff #

n = int(input())
A = list(map(int, input().split()))
zero = 0
one = 0
two = 0
for a in A:
    if a == 0:
        zero += 1
    elif a == 1:
        one += 1
    elif a == 2:
        two += 1
    else:
        pass

tot = zero + one + two + 1
memo = {}
def dfs(z, o, t):
    if z + o + t == 0:
        return 0
    tmp = (z * tot + o) * tot + t
    if tmp in memo:
        return memo[tmp]
    ret = 1
    if z >= 1:
        ret += dfs(z - 1, o + 1, t) * z / n
    if o >= 1:
        ret += dfs(z, o - 1, t + 1) * o / n
    if t >= 1:
        ret += dfs(z, o, t - 1) * t / n
    ret *= n / (z + o + t)
    memo[tmp] = ret
    return ret

print(dfs(zero, one, two))
0