第二回全国統一プログラミング王決定戦予選 B – Counting of Trees をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
第二回全国統一プログラミング王決定戦予選 B – Counting of Trees

頂点 1 を根として木を広げていくイメージを持つと分かりやすい問題。後は根からの距離で整理していけばいい。

# 第二回全国統一プログラミング王決定戦予選 B - Counting of Trees
# https://atcoder.jp/contests/nikkei2019-2-qual/tasks/nikkei2019_2_qual_b
# tag: グラフ 木 構造 順列・組み合わせ MOD

# 頂点 1 を中心として、距離ごとに木を広げていくイメージ。
# 一つ前の距離の頂点数を A 、今回の距離の頂点数を B とすると、
# A 種類のものを B 個選ぶので A^B 通りとなる。

from collections import Counter
def main():
    N = int(input())
    D = list(map(int, input().split()))
    MOD = 998244353

    # 距離 0 になるのは、頂点 1 のみでなければならない
    if D[0] != 0 or 0 in D[1:]:
        print(0)
        return

    # 距離ごとに枝の本数を数えておき、順次掛ける
    cnt = Counter(D)
    result = 1
    for i in range(1, max(D)+1):
        # 一応、あるはずの距離の枝が無ければ 0 を返して終了
        # いずれにせよ、あとから 0 の n 乗が掛かるので必須ではない。
        if cnt[i] == 0:
            print(0)
            return

        # pow(a, b, mod) で (a**b) % mod を高速に計算してくれる
        result = (result * pow(cnt[i-1], cnt[i], MOD)) % MOD

    print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。