結果
| 問題 | No.3635 Probability trip |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-22 02:35:45 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 249 ms / 2,000 ms |
| + 289µs | |
| コード長 | 1,837 bytes |
| 記録 | |
| コンパイル時間 | 225 ms |
| コンパイル使用メモリ | 95,852 KB |
| 実行使用メモリ | 84,992 KB |
| 最終ジャッジ日時 | 2026-08-22 02:35:56 |
| 合計ジャッジ時間 | 8,299 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 43 |
ソースコード
# https://yukicoder.me/problems/no/3635
MOD = 998244353
def prod_matrix(left, right):
n = len(left)
new_matrix = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
for k in range(n):
new_matrix[i][j] += (left[i][k] * right[k][j]) % MOD
new_matrix[i][j] %= MOD
return new_matrix
def prod_vector(matrix, vector):
n = len(vector)
new_vector = [0] * n
for i in range(n):
for j in range(n):
new_vector[i] += (matrix[i][j] * vector[j]) % MOD
new_vector[i] %= MOD
return new_vector
def prob(N, base_matrix, interval_time, start_i, end_i):
matrix = []
for row in base_matrix:
matrix.append(row.copy())
vector = [0] * N
vector[start_i] = 1
while interval_time > 0:
if interval_time % 2 == 1:
vector = prod_vector(matrix, vector)
matrix = prod_matrix(matrix, matrix)
interval_time //= 2
return vector[end_i]
def main():
N, M = map(int, input().split())
next_nodes = [[] for _ in range(N)]
for _ in range(M):
u,v = map(int, input().split())
next_nodes[u - 1].append(v - 1)
next_nodes[v - 1].append(u - 1)
S, T, A, B = map(int, input().split())
A -= 1
B -= 1
matrix = [[0] * N for _ in range(N)]
for from_i in range(N):
n = len(next_nodes[from_i])
inv_n = pow(n, MOD - 2, MOD)
for to_i in next_nodes[from_i]:
matrix[to_i][from_i] = inv_n
prob_b = prob(N, matrix, T - 1, 0, B)
prob_a = prob(N, matrix, S - 1, 0, A)
prob_b_to_a = prob(N, matrix, S - T, B, A)
answer = (prob_b_to_a * prob_b) % MOD
answer *= pow(prob_a, MOD - 2, MOD)
answer %= MOD
print(answer)
if __name__ == "__main__":
main()