(Prufer序列)洛谷P2624 [HNOI2008]明明的烦恼

洛谷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=1k(di1)
根据Prufer序列。
如果 d i = 0 d_i=0 di=0 s u m > n − 2 sum>n-2 sum>n2都是不合法的。
对于已知的 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=1k(di1)!sum!
又因为这 s u m sum sum个点是从 n − 2 n-2 n2个点中选的,所以要乘上组合数,即:
( 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)!} (sumn2)i=1k(di1)!sum!
剩下的 n − 2 − s u m n-2-sum n2sum可以从其余的 n − k n-k nk个点中任选,即:
( 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} (sumn2)i=1k(di1)!sum!(nk)n2sum
化简得:
( 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} (n2sum)!i=1k(di1)!(n2)!(nk)n2sum
看数据范围,直接用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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值