题意简述
有 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个空里面,就保证一定会有至少一个男生间于任意两个女生之间(除非男生不够)。这样就是排列组合的模板。
珂是有了老师后,就要分类讨论。
-
包含"两个老师中间夹着一个女生"这样的子队列。
这个时候,"两个老师中间夹着一个女生"就是一个整体了。再加上 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+2m−1种方案。(插空排列)
这样,总方案数就是四者相乘: A n n ∗ 2 ∗ ( n + 1 ) ∗ A n + 2 m − 1 A_n^n*2*(n+1)*A_{n+2}^{m-1} Ann∗2∗(n+1)∗An+2m−1种。 -
两个老师之间夹着一些女生,一些男生
随便插空即珂,比上面那个简单多了。
男生: 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)
这篇博客介绍了HNOI2012中的一道题目,涉及组合数学和高精度计算。题目要求计算在n个男同学、m个女同学和两个老师中,满足特定条件的队列排列数。分析指出,关键在于处理老师的位置,通过分类讨论和排列组合的插空法来解决。博客提供了Python代码实现,但未展示高精度计算部分。
1247

被折叠的 条评论
为什么被折叠?



