洛谷P2624 [HNOI2008]明明的烦恼
思路:
设要求度数的点有
k
k
k个,
s
u
m
=
∑
i
=
1
k
(
d
i
−
1
)
sum=\sum\limits_{i=1}^{k}(d_i-1)
sum=i=1∑k(di−1)。
根据Prufer序列。
如果
d
i
=
0
d_i=0
di=0或
s
u
m
>
n
−
2
sum>n-2
sum>n−2都是不合法的。
对于已知的
s
u
m
sum
sum个点,方案数就是求全排列,即:
s
u
m
!
∏
i
=
1
k
(
d
i
−
1
)
!
\cfrac{sum!}{\prod\limits_{i=1}^{k}(d_i-1)!}
i=1∏k(di−1)!sum!
又因为这
s
u
m
sum
sum个点是从
n
−
2
n-2
n−2个点中选的,所以要乘上组合数,即:
(
n
−
2
s
u
m
)
s
u
m
!
∏
i
=
1
k
(
d
i
−
1
)
!
\binom{n-2}{sum}\cfrac{sum!}{\prod\limits_{i=1}^{k}(d_i-1)!}
(sumn−2)i=1∏k(di−1)!sum!
剩下的
n
−
2
−
s
u
m
n-2-sum
n−2−sum可以从其余的
n
−
k
n-k
n−k个点中任选,即:
(
n
−
2
s
u
m
)
s
u
m
!
∏
i
=
1
k
(
d
i
−
1
)
!
(
n
−
k
)
n
−
2
−
s
u
m
\binom{n-2}{sum}\cfrac{sum!}{\prod\limits_{i=1}^{k}(d_i-1)!}(n-k)^{n-2-sum}
(sumn−2)i=1∏k(di−1)!sum!(n−k)n−2−sum
化简得:
(
n
−
2
)
!
(
n
−
2
−
s
u
m
)
!
∏
i
=
1
k
(
d
i
−
1
)
!
(
n
−
k
)
n
−
2
−
s
u
m
\cfrac{(n-2)!}{(n-2-sum)!\prod\limits_{i=1}^{k}(d_i-1)!}(n-k)^{n-2-sum}
(n−2−sum)!i=1∏k(di−1)!(n−2)!(n−k)n−2−sum
看数据范围,直接用python就行。
代码:
n=(int)(input())
k=0;sum=0
a=[0]*1100
f=[0]*1100
f[0]=1;
for i in range(1,1001):
f[i]=f[i-1]*i;
for i in range(1,n+1):
a[i]=(int)(input())
if(a[i]==0):
print(0)
exit()
if(a[i]!=-1):
sum+=a[i]-1
k+=1
if(sum>n-2):
print(0)
exit()
ans=f[n-2]//f[n-2-sum]
for i in range (1,n+1):
if(a[i]!=-1):
ans//=f[a[i]-1]
ans*=pow(n-k,n-2-sum)
print(ans)