【BZOJ 2729】 [HNOI2012]排队

2729: [HNOI2012]排队

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 1033   Solved: 474
[ Submit][ Status][ Discuss]

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



排列组合+高精度/python


先把男生排好,有n!种;


然后放入老师,分两种情况:

1.老师放在不同空中:

A(n+1,2)

然后就会产生n+3个空,女生就有A(n+3,m)种

答案就是n!*A(n+1,2)*A(n+3,m)


2.老师放在同一空中:

A(n+1,1)*2

老师中间必须有一个女生,还有n+2个空可放,m*A(n+2,m-1)

答案是n!*A(n+1,1)*2*m*A(n+2,m-1)


def Fac(n):
    ans=1
    for i in range(2,n+1):
	ans*=i
    return ans
def A(n,m):
    if n<m:
	return 0
    return Fac(n)//Fac(n-m)
n,m=raw_input().split()
n=int(n)
m=int(m)
print(Fac(n)*(2*A(n+1,1)*m*A(n+2,m-1)+A(n+1,2)*A(n+3,m)))



python学习网站

你可能感兴趣的:(python,排列组合,OI,bzoj)