洛谷 3223 [HNOI2012]排队 题解(组合数学,高精)

这篇博客介绍了HNOI2012中的一道题目,涉及组合数学和高精度计算。题目要求计算在n个男同学、m个女同学和两个老师中,满足特定条件的队列排列数。分析指出,关键在于处理老师的位置,通过分类讨论和排列组合的插空法来解决。博客提供了Python代码实现,但未展示高精度计算部分。

原题链接:
bzoj
洛谷

题意简述

n n n个男同学, m m m个女同学,两个老师。任意两名女同学不能相邻,两个老师也不能相邻。求有多少种不同的队列?(注意:任意两个人都是不同的,并且区分顺序)

数据

输入

n , m n,m n,m

输出

答案

样例

输入
1 1
输出
12

思路

首先:如果您要问,排列组合是啥?基本概念?请参考我的博客:组合数学基础知识,打好基础。如果只是要看懂这篇博客的话,看看定义即可。如果想稍微深入的了解组合数学,或者要活跃思维,可以看看后面的例题。

如果有一定的基础,就会发现,最妨碍计算的就是那两个老师(果然,无论如何,老师都是学生最讨厌的

如果没有那两个老师,就是"插空法",把 m m m个女生放在 n n n个男生组成的 n + 1 n+1 n+1个空里面,就保证一定会有至少一个男生间于任意两个女生之间(除非男生不够)。这样就是排列组合的模板。

珂是有了老师后,就要分类讨论。

  1. 包含"两个老师中间夹着一个女生"这样的子队列。
    这个时候,"两个老师中间夹着一个女生"就是一个整体了。再加上 n n n个男生,就相当于 n + 1 n+1 n+1个物体,会组成 n + 2 n+2 n+2个空。其中女生,男生,老师都是不同的。所以要用排列组合中的排列( A A A),分三步,来求解这个东西。
    step1. 确定男生: A n n A_n^n Ann种方案。
    step2. 确定老师: A 2 2 = 2 A_2^2=2 A22=2种方案。(这两个都是随便排的)
    step3. 确定选哪个女生: m m m 种方案
    step4. 确定"两个老师中间夹着一个女生"放在哪:
    ( n + 1 ) (n+1) (n+1)种(这一整个结构要放在男生组成的空里面)
    step5. 确定女生插在哪: A n + 2 m − 1 A_{n+2}^{m-1} An+2m1种方案。(插空排列)
    这样,总方案数就是四者相乘: A n n ∗ 2 ∗ ( n + 1 ) ∗ A n + 2 m − 1 A_n^n*2*(n+1)*A_{n+2}^{m-1} Ann2(n+1)An+2m1种。

  2. 两个老师之间夹着一些女生,一些男生
    随便插空即珂,比上面那个简单多了。
    男生: A n n A_n^n Ann种(明显)
    老师: A n + 1 2 A_{n+1}^{2} An+12种(老师插在男生组成的 n + 1 n+1 n+1个空里面)
    女生: A n + 3 m A_{n+3}^{m} An+3m种(女生插在老师和男生组成的 n + 3 n+3 n+3个空里面)

这样加起来即珂。但是我懒得打高精,所以。。。

Python!!!

代码:

def f(n):
    ans=1
    for i in range(1,n+1):
        ans*=i
    return ans
def A(n,m):
    return f(n)//f(n-m)

s=input().split(' ')
n=int(s[0])
m=int(s[1])
ans=0
if(n+1>=2 and n+3>=m):
    ans+=f(n)*A(n+1,2)*A(n+3,m)
if(n+2>=m-1 and m>=1):
    ans+=2*(n+1)*m*f(n)*A(n+2,m-1)
print(ans)

回到总题解界面

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值