結果
問題 | 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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 178 ms
89,216 KB |
testcase_01 | AC | 182 ms
89,216 KB |
testcase_02 | AC | 181 ms
89,216 KB |
testcase_03 | AC | 180 ms
89,344 KB |
testcase_04 | AC | 177 ms
89,728 KB |
testcase_05 | AC | 180 ms
89,344 KB |
testcase_06 | AC | 181 ms
89,216 KB |
testcase_07 | AC | 184 ms
89,600 KB |
testcase_08 | AC | 180 ms
89,216 KB |
testcase_09 | AC | 179 ms
89,472 KB |
testcase_10 | AC | 180 ms
89,344 KB |
testcase_11 | AC | 179 ms
89,216 KB |
testcase_12 | AC | 175 ms
89,856 KB |
testcase_13 | AC | 177 ms
89,600 KB |
testcase_14 | AC | 177 ms
89,216 KB |
testcase_15 | AC | 178 ms
89,472 KB |
testcase_16 | AC | 179 ms
89,472 KB |
testcase_17 | AC | 181 ms
89,216 KB |
testcase_18 | AC | 181 ms
89,472 KB |
testcase_19 | AC | 180 ms
89,472 KB |
testcase_20 | AC | 180 ms
89,216 KB |
testcase_21 | AC | 180 ms
89,344 KB |
testcase_22 | AC | 180 ms
89,216 KB |
ソースコード
#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]])