問題概要
問題ページ
-
D - Poker
問題ページへ移動する
問題文
\(1, 2, \dots, 9\) が表に書かれたカードが \(K\) 枚ずつ、計 \(9K\) 枚のカードがあります。
これらのカードをランダムにシャッフルして、高橋くんと青木くんにそれぞれ、\(4\) 枚を表向きに、\(1\) 枚を裏向きにして配りました。
高橋くんに配られたカードが文字列 \(S\) として、青木くんに配られたカードが文字列 \(T\) として与えられます。
\(S, T\) は \(5\) 文字の文字列で、先頭 \(4\) 文字は 1
, 2
, \(\dots\), 9
からなり、表向きのカードに書かれた数を表します。
末尾 \(1\) 文字は #
であり、裏向きのカードであることを表します。
\(5\) 枚の手札の点数を、\(c_i\) をその手札に含まれる \(i\) の枚数として、\(\displaystyle \sum_{i=1}^9 i \times 10^{c_i}\) で定義します。
高橋くんが青木くんより点数の高い手札を持っていたら高橋くんの勝ちです。
高橋くんの勝つ確率を求めてください。
制約
- \(2 ≤ K ≤ 10^5\)
- \(|S| = |T| = 5\)
- \(S, T\) の \(1\) 文字目から \(4\) 文字目は
1
,2
, \(\dots\),9
のいずれか 1
,2
, \(\dots\),9
はそれぞれ、\(S\) と \(T\) に合計 \(K\) 回までしか出現しない- \(S, T\) の \(5\) 文字目は
#
問題の考察
ACコード
import sys
def solve():
input = sys.stdin.readline
mod = 10 ** 9 + 7
k = int(input().rstrip('\n'))
ls = [k] * 10
ls[0] = 0
tl = [0] * 10
for v in str(input().rstrip('\n'))[:4]:
tl[int(v)] += 1
ls[int(v)] -= 1
al = [0] * 10
for v in str(input().rstrip('\n'))[:4]:
al[int(v)] += 1
ls[int(v)] -= 1
cnt = 0
win = 0
for i in range(1, 10):
for j in range(1, 10):
tl[i] += 1
al[j] += 1
t_s = sum([pow(10, tl[i]) * i for i in range(1, 10)])
a_s = sum([pow(10, al[i]) * i for i in range(1, 10)])
c = 0
if i == j:
if ls[i] >= 2:
c = ls[i] * (ls[i] - 1)
else:
if ls[i] >= 1 and ls[j] >= 1:
c = ls[i] * ls[j]
cnt += c
if t_s > a_s:
win += c
tl[i] -= 1
al[j] -= 1
print(win / cnt)
if __name__ == '__main__':
solve()