結果

問題 No.2047 Path Factory
コンテスト
ユーザー LyricalMaestro
提出日時 2026-10-18 01:41:50
言語 PyPy3
(8.0.0 + ACL)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 619 ms / 2,000 ms
+ 470µs
コード長 2,366 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 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
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

## 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()
0