結果
| 問題 | No.108 トリプルカードコンプ |
| コンテスト | |
| ユーザー |
kusirakusira
|
| 提出日時 | 2022-08-28 22:02:02 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 184 ms / 5,000 ms |
| コード長 | 7,333 bytes |
| コンパイル時間 | 179 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 89,856 KB |
| 最終ジャッジ日時 | 2024-10-15 19:01:13 |
| 合計ジャッジ時間 | 5,351 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 20 |
ソースコード
#Python3/Pypy3テンプレート集
#ライブラリ-------------------------------------------------------------------
import bisect
import heapq
import collections
from itertools import groupby
import itertools
import math
import array
import string
import copy
#テンプレート------------------------------------------------------------------
INF=10**18
MOD=10**9+7
mod=998244353
def YesNo(b): print("Yes") if b else print("No")
def YESNO(b): print("YES") if b else print("NO")
#標準入力---------------------------------------------------------------------
import sys
sys.setrecursionlimit(10 ** 5 + 10000)
input = sys.stdin.readline ####
def int1(x): return int(x) - 1
def II(): return int(input())
def MI(): return map(int, input().split())
def MI1(): return map(int1, input().split())
def LI(): return list(map(int, input().split()))
def LI1(): return list(map(int1, input().split()))
def LIS(): return list(map(int, SI()))
def LA(f): return list(map(f, input().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return input().strip('\n')
def MS(): return input().split()
def LS(): return list(input().strip('\n'))
def LLS(rows_number): return [LS() for _ in range(rows_number)]
#関数------------------------------------------------------------------------
def At(A): #二次元配列の転置
A_t = []
for i in range(len(A[0])) :
tmp = []
for v in A :
tmp.append(v[i])
A_t.append(tmp)
return A_t
def D2L(A): #二次元配列の重複削除
return list(map(list, set(map(tuple, A))))
def CSL(A): #配列Aの累積和
return [0] + list(itertools.accumulate(A))
def nF(n, m=0): #nの階乗 | m:mod(デフォなし)
if(n<=0):
return 0
P = 1
for i in range(1,n+1):
P *= i
if(m==0):
continue
P %= m
return P
def nPr(n, r, m=0): #順列nPr
if(n<=0 or r<=0 or n<r):
return 0
P = 1
for i in range(r,n+1):
P *= i
if(m==0):
continue
P %= m
return P
def nCr(n, r, m=0): #組み合わせnCr
if(n<=0 or r<=0 or n<r):
return 0
N = 1
for i in range(r):
N *= n-i
if(m==0):
continue
N %= m
R = nF(r)
return N//R
def nCrm(n,r,m): #逆元を用いた組み合わせnCr%mod
if(n<=0 or r<=0 or n<r):
return 0
over=1
for i in range(n-r+1,n+1):
over *= i
over %= m
under=1
for i in range(1,r+1):
under *= i
under %= m
return over*pow(under,m-2,m)%m
def DL(n): #nまでの約数のリスト
lower_divisors , upper_divisors = [], []
i = 1
while i*i <= n:
if n % i == 0:
lower_divisors.append(i)
if i != n // i:
upper_divisors.append(n//i)
i += 1
return lower_divisors + upper_divisors[::-1]
def IP(n): #素数判定 => True/False
if n == 2:
return True
if n % 2 == 0:
return False
m = math.floor(math.sqrt(n)) + 1
for p in range(3, m, 2):
if n % p == 0:
return False
return True
def PL(n): #nまでの素数のリスト
is_prime = [True] * (n + 1)
is_prime[0] = False
is_prime[1] = False
for i in range(2, int(n**0.5) + 1):
if not is_prime[i]:
continue
for j in range(i * 2, n + 1, i):
is_prime[j] = False
return [i for i in range(n + 1) if is_prime[i]]
def F2L(n): #2以上の整数n => [[素因数, 指数], ...]の2次元リスト
if(n==1):
return []
arr = []
temp = n
for i in range(2, int(-(-n**0.5//1))+1):
if temp%i==0:
cnt=0
while temp%i==0:
cnt+=1
temp //= i
arr.append([i, cnt])
if temp!=1:
arr.append([temp, 1])
if arr==[]:
arr.append([n, 1])
return arr
def DtoN(num_10,n): #10進数からn進数へ変換する(n<=10)
str_n = ''
while num_10:
if num_10%n>=10:
return -1
str_n += str(num_10%n)
num_10 //= n
return int(str_n[::-1])
def StoR(S: str): #文字列/リストからラングレス圧縮
grouped = groupby(S)
res = []
for k, v in grouped:
res.append((k, int(len(list(v)))))
return res
def RtoS(L: "list[tuple]"): #ラングレス圧縮から文字列 => 文字だけ
res = ""
for c, n in L:
res += c * int(n)
return res
def RtoSc(S: str) : #ラングレス圧縮から文字列 => 文字と個数
grouped = groupby(S)
res = ""
for k, v in grouped:
res += k + str(len(list(v)))
return res
def dsin(d): #度数法でsinを計算する
return math.sin(math.radians(d))
def dcos(d): #度数法でcosを計算する
return math.cos(math.radians(d))
def RM(x,y,d,cx=0,cy=0): #P(x,y)をA(cx,cy)を中心としてに反時計回りにd°回転 => [x,y]
nx = (x-cx)*dcos(d)-(y-cy)*dsin(d)
ny = (x-cx)*dsin(d)+(y-cy)*dcos(d)
return [nx+cx,ny+cy]
def engL(): return list(string.ascii_lowercase)
def ENGL(): return list(string.ascii_uppercase)
def TS(_str): #変数/リストに格納されている値を確認
print('{}: {}'.format(_str, eval(_str)))
def T2d(A): #二次元配列の確認用
for a in A:
print(*a)
def BR(): #横線で区切りを入れる
print("---")
#クラス----------------------------------------------------------------------
#カンニングペーパー-----------------------------------------------------------
'''
At(A): #二次元配列の転置
D2L(A): #二次元配列の重複削除
CSL(A) #配列Aの累積和
nF(n,m) #nの階乗 | m:mod(デフォなし)
nPr(n,r,m) #順列nPr | m:mod(デフォなし)
nCr(n,r,m) #組み合わせ,nCr | m:mod(デフォなし)
nCrm(n,r,m): #逆元を用いた組み合わせnCr%mod
DL(n) #nの約数のリスト
IP(n) #素数判定 => True/False
PL(n) #nまでの素数のリスト
F2L(n) #2以上の整数n => [[素因数, 指数], ...]の2次元リスト
DtoN(num_10,n) #10進数からn進数へ変換する(n<=10)
StoR #文字列/リストからラングレス圧縮
RtoS #ラングレス圧縮から文字列 => 文字だけ
RtoSc #ラングレス圧縮から文字列 => 文字と個数
dsin(d): #度数法でsinを計算する
dcos(d): #度数法でcosを計算する
RM(x,y,d,cx,cy): #P(x,y)をA(cx,cy)を中心としてに反時計回りにd°回転(デフォ原点) => [x,y]
engL() #英小文字のリスト
ENGL() #英大文字のリスト
TS(_str) #変数/リストに格納されている値を確認 => 〇〇:××
T2d(A): #二次元配列の確認用
BR() #横線で区切りを入れる
'''
#----------------------------------------------------------------------------
#このテンプレートではAtCoder Easy Test v2でnumpyは動かない。
n = II()
A = LI()
cnt = collections.Counter(A)
dp = [[[0 for _ in range(105)]for _ in range(105)]for _ in range(105)]
for i in range(101):
for j in range(101):
for k in range(101):
z = i+j+k
if(z==0): continue
dp[i][j][k] = n/z
if(i-1>=0): dp[i][j][k] += dp[i-1][j+1][k] * i / z
if(j-1>=0): dp[i][j][k] += dp[i][j-1][k+1] * j / z
if(k-1>=0): dp[i][j][k] += dp[i][j][k-1] * k / z
print(dp[cnt[0]][cnt[1]][cnt[2]])
kusirakusira