結果
| 問題 | No.1688 Veterinarian | 
| コンテスト | |
| ユーザー |  lam6er | 
| 提出日時 | 2025-03-20 19:03:07 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                RE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 3,153 bytes | 
| コンパイル時間 | 169 ms | 
| コンパイル使用メモリ | 82,496 KB | 
| 実行使用メモリ | 75,160 KB | 
| 最終ジャッジ日時 | 2025-03-20 19:03:17 | 
| 合計ジャッジ時間 | 1,901 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 4 RE * 10 | 
ソースコード
A, B, C, N = map(int, input().split())
# Initialize the DP table for k=0 (all zeros)
prev_dp = [[[ (0.0, 0.0, 0.0) for _ in range(C+1)] for __ in range(B+1)] for ___ in range(A+1)]
for step in range(N):
    current_dp = [[[0.0 for _ in range(3)] for __ in range(B+1)] for ___ in range(A+1)]
    for a in range(A+1):
        for b in range(B+1):
            for c in range(C+1):
                total = a + b + c
                if total < 2:
                    current_dp[a][b][c] = (0.0, 0.0, 0.0)
                    continue
                total_choose = total * (total - 1) // 2
                expected_w = 0.0
                expected_b = 0.0
                expected_cr = 0.0
                
                # Same white
                if a >= 2:
                    pairs = a * (a - 1) // 2
                    prob = pairs / total_choose
                    new_a = a - 1
                    ew, eb, ecr = prev_dp[new_a][b][c]
                    expected_w += prob * (1.0 + ew)
                    expected_b += prob * eb
                    expected_cr += prob * ecr
                
                # Same black
                if b >= 2:
                    pairs = b * (b - 1) // 2
                    prob = pairs / total_choose
                    new_b = b - 1
                    ew, eb, ecr = prev_dp[a][new_b][c]
                    expected_b += prob * (1.0 + eb)
                    expected_w += prob * ew
                    expected_cr += prob * ecr
                
                # Same brown
                if c >= 2:
                    pairs = c * (c - 1) // 2
                    prob = pairs / total_choose
                    new_c = c - 1
                    ew, eb, ecr = prev_dp[a][b][new_c]
                    expected_cr += prob * (1.0 + ecr)
                    expected_w += prob * ew
                    expected_b += prob * eb
                
                # Different pairs
                # White and Black
                if a > 0 and b > 0:
                    pairs = a * b
                    prob = pairs / total_choose
                    ew, eb, ecr = prev_dp[a][b][c]
                    expected_w += prob * ew
                    expected_b += prob * eb
                    expected_cr += prob * ecr
                
                # White and Brown
                if a > 0 and c > 0:
                    pairs = a * c
                    prob = pairs / total_choose
                    ew, eb, ecr = prev_dp[a][b][c]
                    expected_w += prob * ew
                    expected_b += prob * eb
                    expected_cr += prob * ecr
                
                # Black and Brown
                if b > 0 and c > 0:
                    pairs = b * c
                    prob = pairs / total_choose
                    ew, eb, ecr = prev_dp[a][b][c]
                    expected_w += prob * ew
                    expected_b += prob * eb
                    expected_cr += prob * ecr
                
                current_dp[a][b][c] = (expected_w, expected_b, expected_cr)
    prev_dp = current_dp
final = prev_dp[A][B][C]
print(final[0], final[1], final[2])
            
            
            
        