[BZOJ2729]:[HNOI2012]排队(组合数学)
题目传送门
题目描述
某中学有n名男同学,m名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
输入格式
只有一行且为用空格隔开的两个非负整数n和m,其含义如上所述。
输出格式
输出文件output.txt仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
数据范围与提示
对于30%的数据:n≤100,m≤100
对于100%的数据:n≤2000,m≤2000
题解
一道组合数学的入门题,还不会组合数学的可以跳转这篇博客:组合数学入门。
ppt上的例题,附带讲解:
将男生和女生混在一起,将女生往里插
如果两个老师在一起,方案数为$A_{n+1}^{n+1}$×$A_{2}^{2}$
两个老师之间必须插进一个女生
将两个老师和一个女生打包成一坨当成一个男生
方案数为m×$A_{n+1}^{n+1}$×$A_{2}^{2}$
剩余m-1个女生,插进n+2个空位中
总方案数为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_{n+2}^{n+2}$-$A_{n+1}^{n+1}$×$A_{2}^{2}$)×$A_{m}^{m}$×$C_{n+3}^{m}$
最终答案为: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}$
但是呢?我懒。
这也太麻烦了吧?!
于是,自己推式子:
依然分类讨论:
先讨论两个老师中间只站一个女生,将老师和那个女生看为一个整体:
$A_{m}^{1}$×$A_{n}^{n}$×$A_{n+1}^{1}$×$A_{2}^{2}$×$A_{n+2}^{m-1}$。
接着讨论两个男生中间站一个老师的情况:
$A_{n}^{n}$×$A_{n+1}^{2}$×$A_{n+3}^{m}$。
然后整理化简得:(n2+3×n+2×m)×(n+1)!×(n-m+4)×(n-m+5)×…×(n+2)。
代码时刻
- #include<bits/stdc++.h>
- using namespace std;
- int n,m;
- int l=1;
- long long ans[100001],flag1,flag2;
- void wzc(int x)//高精乘低精
- {
- flag2=0;
- for(int i=1;i<=l;i++)
- {
- flag1=ans[i]*x;
- ans[i]=flag1%1000000000000000+flag2;
- flag2=flag1/1000000000000000;
- }
- if(flag2)ans[++l]=flag2;
- }
- int main()
- {
- ans[1]=1;
- scanf("%d%d",&n,&m);
- wzc(n*n+n*3+2*m);
- for(int i=1;i<=n+1;i++)
- wzc(i);
- for(int i=n-m+4;i<=n+2;i++)
- wzc(i);
- cout<<ans[l];
- while(--l)
- {
- cout.fill('0');//不足补0
- cout<<setw(15)<<ans[l];
- }
- return 0;
- }
rp++
[BZOJ2729]:[HNOI2012]排队(组合数学)的更多相关文章
- BZOJ2729:[HNOI2012]排队(组合数学)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- 【bzoj2729】[HNOI2012]排队 组合数学+高精度
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入 ...
- BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】
题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...
- BZOJ2729 HNOI2012排队(组合数学+高精度)
组合入门题.高精度入门题. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...
- bzoj2729 [HNOI2012]排队
组合数学,推一下式子,并不难推. java代码 import java.io.*; import java.math.BigInteger; import java.util.*; public cl ...
- [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- 【BZOJ2729】[HNOI2012]排队 组合数
[BZOJ2729][HNOI2012]排队 Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那 ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 957 Solved: 449[Submit][Status] ...
随机推荐
- C语言--浮点数
在程序中使用浮点数 -- 浮点数的精确性有限 -- 在从c语言中float类型的精确度只到小数点的7位 -- 浮点数只能在一定范围内去相信它 -- 在有精确度高的要求下不要使用浮点数(在算钱的时候,误 ...
- 140. 后缀数组(hash + 二分 / 后缀数组)
题目链接 : https://www.acwing.com/problem/content/description/142/ Hash + 二分 #include <bits/stdc++.h& ...
- PropertyUtilsBean 将bean转成map
public static Map<String,String> beanToMap(Object bean) { Map<String,String> params =Map ...
- JavaSE--关键字
关键字 1.static 属于成员修饰符,被静态修饰符修饰的成员要使用类名直接调用,该成员优先于对象存在,属于类且被所有实例化对象共享,静态成员随着类的加载而加载. 访问权限:静态成员优先于对象加载致 ...
- Filter实现登录功能限制
public void doFilter(ServletRequest arg0,ServletResponse arg1,FilterChain chain) throws IOException, ...
- VS编译器问题总结
error C2236: 意外的“class”“CTsgBaseTask”.是否忘记了“;”? 出现这个问题的原因是在引用的一个头文件中定义的一个类最后没有加分号";".
- js 一些小技巧
Javascript 中的 绑定事件 on $(document).on("事件","元素","方法"): Js 定时方法 1.setTim ...
- 五种I/O模型
文档地址:https://www.cse.huji.ac.il/course/2004/com1/Exercises/Ex4/I.O.models.pdf 五种I/O模型: 1. blocking ...
- jquery 查找元素,并判断隐藏或显示
html <div class="panel-heading"> <h4 class="panel-title"> <a data ...
- java课堂作业4
第一题 字符串加密问题 1.程序设计思想 读入字符串,然后获取其长度,利用charAt()获取每个位置字符并且对字符加3实现加密处理,并存入新字符串中.如果遇到xyz则减26存入. 2.程序流程图 3 ...