Edit

【pythonでABC193を解説】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()

-Edit
-