u++の備忘録

「第二回全国統一プログラミング王決定戦予選」参加録

「第二回全国統一プログラミング王決定戦予選」に参加してA, Bの2完でした。約7カ月ぶりのRated参加だったこともあり、「あまりを計算し忘れる」という初歩的な見落としで爆死しました。。。

atcoder.jp

f:id:upura:20191109225056p:plain

A - Sum of Two Integers(100点)

  • 偶数と奇数で場合分け
N = int(input())
print((N-1)//2)

B - Counting of Trees(300点)

  • ノード1からの距離で分類して、距離0から1ずつ段階的に考える
    • 前の距離のノードがa個、今の距離のノードがb個ある場合、選択肢がa**b通り増える
    • 入力例3の場合は、1*1*(2**3)*(3**1)で24通りになる
  • いくつかコーナーケースがあるのに注意
    • 距離0のノードは1のみの1個でなければ不可能
    • [0 1 1 3]のように、距離の欠損があると不可能

f:id:upura:20191109225948p:plain

import collections


N = int(input())
D = list(map(int, input().split()))

c = collections.Counter(D)

max_D = max(D)
ans = 1
previous_leaf = 1

if D[0] != 0:
    ans = 0
elif c[0] != 1:
    ans = 0
else:
    for i in range(1, max_D+1):
        ans *= (previous_leaf ** c[i])
        ans %= 998244353
        previous_leaf = c[i]

print(ans)