【BZOJ】2729: [HNOI2012]排队

题意

\(n\)个男生\(m\)个女生\(2\)个老师排列,任意两个女生不能相邻,两个老师也不能相邻,每个人都不同。问有多少种排法。(\(n, m \le 2000\)

分析

组合乱搞。

题解

先放男生:\(A(n, n)\)种方案,\(n+1\)格空隙
两个老师不挨在一起放入男生中。
先放老师:\(n+1\)个空隙里放2个老师的方案:\(A(n+1, 2)\)
接着放女生:\(n+3\)个空隙里放m个女生的方案:\(A(n+3, m)\)
总方案:\(A(n, n) * A(n+1, 2) * A(n+3, m)\)

两个老师挨在一起放入男生中:
将一个女生拿出来插到老师中间将这三个人看成男生:
总方案:\(A(n+1, n+1) * A(2, 2) * m * A(n+2, m-1)\)

所以\(ans=A(n, n) * A(n+1, 2) * A(n+3, m)+A(n+1, n+1) * A(2, 2) * m * A(n+2, m-1)\)
\(n+3<m\)时,\(ans=0\)

n, m=map(int, raw_input().split())
if n+3<m:
    print("0")
else:
    p=[0 for i in range(0, n+3+1)]
    p[0]=p[1]=1
    for i in range(2, n+3+1):
        p[i]=p[i-1]*i
    print(p[n]*(p[n+1]/p[n-1])*(p[n+3]/p[n+3-m]) + 2*m*p[n+1]*(p[n+2]/p[n+3-m]))

转载于:https://www.cnblogs.com/iwtwiioi/p/4985757.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值