题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

1  1

输出样例#1:

12

Solution:

  本题组合数学+高精度。

  冷静分析。。。

  首先$n$个男生的全排列为$A(n,n)$,在形成的$n+1$个空中插入两名老师方案数为$A(n+1,2)$,新形成的$n+3$个空中选择$m$个插入女生方案数为$A(n+3,m)$。

  注意到上面的情况并没有包含两名老师夹一个女生的情况,我们需要补上该情况的方案:把两名老师和一个女生看作整体,有$A(2,2)*m$种方案,然后把这个整体插入到$n+1$个空中有$A(n+1,1)$种方案,最后的$m-1$个女生插入到$n+2$个空中方案数为$A(n+2,m-1)$。

  综上所述,总的方案数为$A(n,n)*A(n+1,2)*A(n+3,m)+m*A(2,2)*A(n+1,1)*A(n+2,m-1)$,然后需要用到高精度加法和乘法,结构体重载运算符就好了。

代码:

/*Code by 520 -- 9.13*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const ll N=5005,Base=1e8;
ll n,m;
struct node{ll a[N],len;il void Clr(){memset(a,0,sizeof a),len=0;}il void Push(int x){a[len=1]=x;}node operator * (const node &X) const{node tp;tp.Clr();tp.len=len+X.len+10;For(i,1,len) For(j,1,X.len) {tp.a[i+j-1]+=a[i]*X.a[j];tp.a[i+j]+=tp.a[i+j-1]/Base;tp.a[i+j-1]%=Base;}For(i,1,tp.len) tp.a[i+1]+=tp.a[i]/Base,tp.a[i]%=Base;while(tp.len&&!tp.a[tp.len]) tp.len--;return tp;}node operator + (const node &X) const{node tp;tp.Clr();tp.len=max(len,X.len)+10;For(i,1,tp.len){tp.a[i]+=a[i]+X.a[i];tp.a[i+1]+=tp.a[i]/Base;tp.a[i]%=Base;}For(i,1,tp.len) tp.a[i+1]+=tp.a[i]/Base,tp.a[i]%=Base;while(tp.len&&!tp.a[tp.len]) tp.len--;return tp;}il void Output(){printf("%lld",a[len]);Bor(i,1,len-1) printf("%08lld",a[i]);}
}ans;il node A(ll n,ll m){node res,tp;res.Clr(),tp.Clr(),res.Push(1);if(!m) return res;if(m>n) {ans.Clr();return res;}For(i,n-m+1,n) tp.Push(i),res=res*tp;return res;
}int main(){cin>>n>>m;if(!n&&!m) cout<<0,exit(0);ans=A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*A(n+1,1)*A(2,2)*A(m,1)*A(n+2,m-1);ans.Output();return 0;
}

转载于:https://www.cnblogs.com/five20/p/9651212.html

P3223 [HNOI2012]排队相关推荐

  1. P3223 [HNOI2012]排队(高中排列组合)

    传送门 题意 nnn个男生,mmm个女生,222个老师排队 女生和女生不能相邻,老师和老师不能相邻,问方案数. 考虑到老师只有两个,所以可以对老师来讨论. Ⅰ.\color{Red}Ⅰ.Ⅰ.两只老师间 ...

  2. 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 957  Solved: 449 [Submit][Status ...

  3. [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)

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

  4. [HNOI2012]排队

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

  5. bzoj2729: [HNOI2012]排队

    高精度+排列组合. 如果计算老师能挨在一起的情况 有 (n+2)! * A(n+3,m) 老师一定挨宰一起的情况 有 2*(n+1)!*A(n+2,m). 相减就是答案. #include<cs ...

  6. BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】

    题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...

  7. 数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

    丝且人一口 Virus Tree 2 description solution code RGB Coloring description solution code 123 Triangle des ...

  8. # HNOI2012 ~ HNOI2018 题解

    HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...

  9. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  10. 【青少年编程】【蓝桥杯】排队购票

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 我们将有关编程题目的教学视频已经发布到抖 ...

最新文章

  1. 轻量级RGB-D显著目标检测的中层融合
  2. 原创Kafka学习笔记,java如何用数组生成随机数
  3. Linux杂项设备驱动
  4. python中字典的增删改查及其他常用操作
  5. 十万腾讯人,自救1000天
  6. 关系重叠?实体嵌套?曝光偏差?这个模型统统都搞得定!
  7. 鲲鹏云实验-.NET Core 3.0-开始使用
  8. mybatis xml标签,批量插入
  9. 研究生最忌讳的几点是什么?读研期间你该主动做什么?
  10. 3.4选择性嵌入服务容器
  11. MySQL学习十四创建和操纵表
  12. Android studio实现语音转文字功能
  13. 金融科技之交易:动量效应选股策略
  14. python 实现任务管理清单案例
  15. gitlab ip变更runner拉取代码失败、shell启动springboot项目启动起来。
  16. python的模块查找路径
  17. pytorch处理CK+数据集
  18. 19 | 容器安全(1):我的容器真的需要privileged权限吗?
  19. 《Windows》Windows系统的日期和时间设置
  20. Ubuntu18.04未发现WiFi适配器解决方案汇总

热门文章

  1. LInux iptables学习
  2. 微软职位内部推荐-Software Development Engineering II
  3. 价值5000元的报表分享
  4. 数据结构与算法 第二章习题课
  5. 顺情说好话,耿直讨人嫌
  6. xgboost的原理没你想像的那么难
  7. 只用两行代码,我让Transformer推理加速了50倍
  8. python—IFrame:在jupyter notebook中展示某个网页的情况
  9. 数据科学包9-pandas高级内容之数据IO
  10. Hive--sql中的窗口函数