[HNOI2008]明明的煩惱

青煙繞指柔!發表於2020-11-20

題目連結:[HNOI2008]明明的煩惱


如果按照樹形態dp,是不可做的。
我們直接按照prufer序列組合數求即可。看成一個 n-2 長度的序列。

對於固定的度,相當於盒子中放球,然後剩下的未定的,相當於從剩下位置中隨便放。
因為要高精度,所以用的py


AC程式碼:

fac=[1]*(1010)
def C(n,m):
    return fac[n]//fac[m]//fac[n-m]
def main():
    n=int(input())
    a=[1]*(n+10)
    fac[0]=1
    for i in range(1,n+3):
        fac[i]=fac[i-1]*i
    cnt=0
    res=1
    now=0
    for i in range(0,n):
        a[i]=int(input())
        if a[i]==-1:
            cnt+=1
        if a[i]>=n:
            print(0)
            return ;
        if a[i]>1:
            now+=a[i]-1
    if now>=(n-1):
        print(0)
        return ;
    res=int(pow(cnt,n-2-now))
    now=n-2
    for i in range(0,n):
        if a[i]>1:
            res*=int(C(now,a[i]-1))
            now-=(a[i]-1)
    print(int(res))
main()

相關文章