解法1:DP
考え方
- 後退解析をする(先手の勝ち負けが確定している最終状態から,逆に考えていく).
- modの逆数:modの逆数 - 競プロはじめました
回答例
dp[i][j][k] = 先手がiにいて, 後手がjにいて, 手番がk(0:先手,1:後手)のとき,先手が勝つ確率.N, A, B, P, Q = map(int, input().split()) mod = 998244353 invP = pow(P, mod - 2, mod) invQ = pow(Q, mod - 2, mod) dp = [[[0] * 2 for _ in range(N + 1)] for _ in range(N + 1)] for i in range(1, N): dp[N][i] = [1, 1] for i in range(N - 1, A - 1, -1): for j in range(N - 1, B - 1, -1): for p in range(1, P + 1): dp[i][j][0] += dp[min(i + p, N)][j][1] dp[i][j][0] *= invP dp[i][j][0] %= mod for q in range(1, Q + 1): dp[i][j][1] += dp[i][min(j + q, N)][0] dp[i][j][1] *= invQ dp[i][j][1] %= mod print(dp[A][B][0])