zoukankan      html  css  js  c++  java
  • 【bzoj2729】[HNOI2012]排队 组合数学+高精度

    题目描述

    某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)

    输入

    只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
    对于 30%的数据 n≤100,m≤100
    对于 100%的数据 n≤2000,m≤2000

    输出

    输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。

    样例输入

    1 1

    样例输出

    12


    题解

    组合数学+高精度

    先不考虑两名老师不相邻,那么就相当于有$n+2$个男同学和$m$个女同学,女同学不能相邻。显然使用插空法解决。$n+2$个男同学有$(n+2)!$种排法,$m$个女同学放入到$n+3$个空位中有$A_{n+3}^m$种排法,故总方案数为$(n+2)!*A_{n+3}^m$。

    再考虑两名老师相邻的情况,如果他们相邻,则可以放在一起当做一个人处理,处理同上为$(n+1)!*A_{n+2}^m$,还要再乘上一个$2!$,因为两名老师有$2!$种排法。

    故答案为$(n+2)!*A_{n+3}^m-2!*(n+1)!*A_{n+2}^m$。

    需要高精度,使用Python解决。

    def mul(x , y):
    	ans = 1
    	for i in range (x , y + 1):
    		ans = ans * i
    	return ans
    s = input().split()
    n = int(s[0])
    m = int(s[1])
    print(mul(1 , n + 2) * mul(n - m + 4 , n + 3) - 2 * mul(1 , n + 1) * mul(n - m + 3 , n + 2))
    
  • 相关阅读:
    Hibernate4.0之HibernateSessionFactory源码详解
    Struts.xml中Action的method与路径的三种匹配方法
    codeforces B. Ohana Cleans Up
    codeforces C. Vanya and Scales
    Hibernate主键生成策略
    codeforces B
    FileUpload实现文件上传(包含多文件)
    structs2之多文件上传
    svn的安装与使用
    codeforces Soldier and Number Game(dp+素数筛选)
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7371412.html
Copyright © 2011-2022 走看看