Description
某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
Input
只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
对于 30%的数据 n≤100,m≤100
对于 100%的数据 n≤2000,m≤2000
Output
输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
Sample Input
1 1
Sample Output
12
HINT
Source
day1
考虑当前有所有老师和男生构成的序列,而向里面插入女生
如果初始老师和男生的序列里两老师不相邻,则有
An+2n+2−An+1n+1A22
种序列.然后插入女生后方案数显然为
(An+2n+2−An+1n+1A22)AmmCmn+3
在考虑初始序列里两个老师在一起,这样的方案数为
An+1n+1A22
,为了满足条件,使一个确定的女生放在两老师之间,然后把”老师 女生 老师”这样一个序列看成一个整体(它将不会再影响之后女生的插入,可以视为一个男生)然后插入剩下的m-1名女生,这种情况的方案数为
mAn+1n+1A22Am−1m−1Cm−1n+2
两个方案数可以直接加起来得到答案.
Python大法好!
def fac(n):
ret=1
if n==0:
return 1
for i in range(1,n+1):
ret*=i
return ret
def A(n,m):
if n<m:
return 0
return fac(n)//fac(n-m)
def C(n,m):
if n<m:
return 0
return fac(n)//fac(m)//fac(n-m)
n, m = raw_input().split()
n = int(n)
m = int(m)
print m*A(n+1,n+1)*A(2,2)*A(m-1,m-1)*C(n+2,m-1)+(A(n+2,n+2)-A(n+1,n+1)*A(2,2))*A(m,m)*C(n+3,m)