洛谷P2624 [HNOI2008]明明的煩惱(prufer序列 樹計數)

題目

給出標號爲1到N的點,以及某些點最終的度數,允許在任意兩點間連線,可產生多少棵度數滿足要求的樹

輸入:第一行爲N(0<N<=1000),接下來N行,第i+1行給出第i個節點的度數Di,如果對度數不要求,則輸入-1

輸出:一個整數,表示不同的滿足要求的樹的個數,無解輸出0

思路來源

https://m-sea-blog.com/archives/1661/

題解

prufer序列,常用來解決,和度數有關的樹計數問題

大數,懶得粘板子,py一發入魂,這個列表用得妙啊

太久不用py了,除法要用整除的//,否則會被理解成double從而在洛谷裏RE

代碼

n = int(input())
fac = [1]
ans = 1
for i in range(1, n - 1):
    fac = fac + [fac[i - 1] * i]
ans = fac[n - 2]
cnt = 0
sum = n - 2
for i in range(n):
    d = int(input())
    if d != -1:
        ans = ans // fac[d - 1]
        sum -= d-1
    else:
        cnt += 1
ans = ans // fac[sum]
for i in range(sum):
    ans = ans * cnt
print(ans)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章