結果
| 問題 | No.2047 Path Factory |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-18 01:41:50 |
| 言語 | PyPy3 (8.0.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 619 ms / 2,000 ms |
| + 470µs | |
| コード長 | 2,366 bytes |
| 記録 | |
| コンパイル時間 | 110 ms |
| コンパイル使用メモリ | 64,872 KB |
| 実行使用メモリ | 225,160 KB |
| 最終ジャッジ日時 | 2026-10-18 01:42:02 |
| 合計ジャッジ時間 | 8,627 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
## https://yukicoder.me/problems/no/2047
import sys
sys.setrecursionlimit(101000)
MOD = 998244353
def main():
N = int(input())
next_nodes = [[] for _ in range(N)]
for _ in range(N - 1):
u, v = map(int , input().split())
next_nodes[u - 1].append(v - 1)
next_nodes[v - 1].append(u - 1)
dp = [[0, 0, 0] for _ in range(N)]
def dfs(N, next_nodes, current_node, parent_node):
for w in next_nodes[current_node]:
if w == parent_node:
continue
dfs(N, next_nodes, w, current_node)
# 0: 親からpathが続いてないを計算
dp2 = [1, 0, 0]
for w in next_nodes[current_node]:
if w == parent_node:
continue
new_dp2 = [0, 0, 0]
new_dp2[0] += (dp[w][0] * dp2[0]) % MOD
new_dp2[0] %= MOD
new_dp2[1] += (dp[w][0] * dp2[1]) % MOD
new_dp2[1] %= MOD
new_dp2[2] += (dp[w][0] * dp2[2]) % MOD
new_dp2[2] %= MOD
new_dp2[1] += (dp[w][1] * dp2[0]) % MOD
new_dp2[1] %= MOD
new_dp2[1] += (dp[w][2] * dp2[0]) % MOD
new_dp2[1] %= MOD
new_dp2[2] += (dp[w][1] * dp2[1]) % MOD
new_dp2[2] %= MOD
new_dp2[2] += (dp[w][2] * dp2[1]) % MOD
new_dp2[2] %= MOD
dp2 = new_dp2
dp[current_node][0] = (dp2[1] + dp2[2]) % MOD
# 1: 親からpathが続いている
dp2 = [1, 0]
for w in next_nodes[current_node]:
if w == parent_node:
continue
new_dp2 = [0, 0]
new_dp2[0] += (dp[w][0] * dp2[0]) % MOD
new_dp2[0] %= MOD
new_dp2[1] += (dp[w][0] * dp2[1]) % MOD
new_dp2[1] %= MOD
new_dp2[1] += (dp[w][1] * dp2[0]) % MOD
new_dp2[1] %= MOD
new_dp2[1] += (dp[w][2] * dp2[0]) % MOD
new_dp2[1] %= MOD
dp2 = new_dp2
dp[current_node][1] = dp2[1]
# 2: 親からpathが続くがそここが
a = 1
for w in next_nodes[current_node]:
if w == parent_node:
continue
a *= dp[w][0]
a %= MOD
dp[current_node][2] = a
dfs(N, next_nodes, 0, -1)
print(dp[0][0])
if __name__ == "__main__":
main()