洛谷P2624 [HNOI2008]明明的烦恼(Prufer序列+组合数学)
洛谷P2624 [HNOI2008]明明的烦恼(Prufer序列+组合数学)
**题目:**给你n个节点的树中某些节点的度数,其他节点的度数任意,问有多少种满足题意的树。
思路:
假设给出n个节点的K个节点度数确定,且分别为 d1,d2,d3...dk。我们令 ai=di−1, 且设 sum=∑i=1kai。
那么有 ans=C(n−2a1)∗C(n−2−a1a2)∗...C(n−2−a1−a2..−ak−1ak)=(n−2−sum)!∗Πi=1kai!(n−2)!∗(n−k)(n−2−sum)
代码:
def quick_pow(a,b):
ans=1
while b>0:
if (b&1)>0 :
ans*=a
a*=a
b>>=1
return ans
def init(n):
fac = [0 for i in range(n + 1)]
fac[0]=1
for i in range(1,n+1):
fac[i]=fac[i-1]*i
return fac
if __name__ == '__main__':
# a,b=[int(i) for i in (input().split())]
# print(a,b)
# print(quick_pow(a,b))
n=int(input())
du=[]
for i in range(n):
x=int(input())
du.append(x)
if n==1:
if du[0]>0:
print(0)
else:
print(1)
exit()
sum=0
for i in du:
if i==0:
print(0)
exit()
if i==-1:
continue
sum+=i-1
if sum>n-2:
print(0)
exit()
#此时n>=2且du[]>1,且sum<=n-2
fac=init(n)
ans=fac[n-2]//fac[n-2-sum]
k=0
for i in du:
if i==-1:
continue
ans//=fac[i-1]
k+=1
ans*=quick_pow(n-k,n-2-sum)
print(int(ans))