题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

  1. 1 1
输出样例#1:

  1. 12
  2.  
  3. 题解:高精+排列组合
    n个男生排列An,n),然后插上两个老师A(n+1,2),然后插上m个女生
    A(n+2,m-1),结果就是A(n,n)*A(n+1,2)*A(n+2,m-1)。
    但是发现,两个老师插入时是可以挨在一起的,只要一个女生去他们中间就好了。
    把两个老师看成一个男生,是A(n+1,n+1)*A2,2),中间再插入一个女生
    A(n+1,n+1)*A(2,2)*m,然后剩下的m-1个女生再插入,结果是
    A(n+1,n+1)*A2,2)*m*A(n+2,m-1)。
    那么总的答案就是
    A(n,n)*A(n+1,2)*A(n+3,m)+A(n+1,n+1)*A(2,2)*m+A(n+2,m-1)
    化简一下式子最后只要高精乘就可以了。
    这是个压位高精吧...背的Candy?模板我也不知道啊...(逃...
    一直WA原来是数组开小了...
    代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define LL long long
  5. #define B 10000
  6. using namespace std;
  7. LL m,n;
  8. struct Big{
  9. int a[], n;
  10. int& operator [](int x) {return a[x];}
  11. Big():n() {memset(a, , sizeof(a));}
  12. void ini(int x) {a[]=x; n=;}
  13. }ans,p;
  14.  
  15. Big operator *(Big a, int b) {
  16. int g=;
  17. for(int i=; i<=a.n; i++)
  18. g += a[i]*b, a[i] = g%B, g/=B;
  19. if(g) a[++a.n] = g;
  20. return a;
  21. }
  22.  
  23. Big operator *(Big a, Big b) {
  24. Big c;
  25. for(int i=; i<=a.n; i++) {
  26. int g=;
  27. for(int j=; j<=b.n; j++)
  28. g += c[i+j-]+a[i]*b[j], c[i+j-] = g%B, g/=B;
  29. c[i+b.n] = g;
  30. }
  31. c.n = a.n + b.n;
  32. while(c.n> && c[c.n]==) c.n--;
  33. return c;
  34. }
  35.  
  36. Big operator +(Big a, Big b) {
  37. int g=, n=max(a.n, b.n);
  38. for(int i=; i<=n; i++) {
  39. g += i<=a.n ? a[i] : ;
  40. g += i<=b.n ? b[i] : ;
  41. a[i] = g%B, g/=B;
  42. }
  43. a.n = n;
  44. if(g) a[++a.n] = g;
  45. return a;
  46. }
  47.  
  48. Big operator -(Big a, Big b) {
  49. for(int i=; i<=b.n; i++) {
  50. if(a[i]<b[i]) a[i]+=B, a[i+]--;
  51. a[i] -= b[i];
  52. }
  53. int p=b.n+;
  54. while(a[p]<) a[p]+=B, a[++p]--;
  55. while(a.n> && a[a.n]==) a.n--;
  56. return a;
  57. }
  58.  
  59. void Print(Big &a) {
  60. printf("%d", a[a.n]);
  61. for(int i=a.n-; i>=; i--) printf("%04d", a[i]);
  62. }
  63.  
  64. int main(){
  65. scanf("%d%d",&n,&m);ans.a[]=;p.a[]=;
  66. for(int i=;i<=n;i++)ans=ans*i;
  67. ans=ans*n*(n+);
  68. for(int i=n+-m+;i<=n+;i++)ans=ans*i;
  69. for(int i=;i<=n+;i++)p=p*i;
  70. p=p**m;
  71. for(int i=n+-m+;i<=n+;i++)p=p*i;
  72. ans=ans+p;
  73. Print(ans);
  74. return ;
  75. }
  1.  

洛谷 P3223 [HNOI2012]排队的更多相关文章

  1. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  2. 洛谷P3222 [HNOI2012]射箭(计算几何,半平面交,双端队列)

    洛谷题目传送门 设抛物线方程为\(y=ax^2+bx(a<0,b>0)\),我们想要求出一组\(a,b\)使得它尽可能满足更多的要求.这个显然可以二分答案. 如何check当前的\(mid ...

  3. BZOJ2730或洛谷3225 [HNOI2012]矿场搭建

    BZOJ原题链接 洛谷原题链接 显然在一个点双连通分量里,无论是哪一个挖煤点倒塌,其余挖煤点就可以互相到达,而对于一个点双连通分量来说,与外界的联系全看割点,所以我们先用\(tarjan\)求出点双连 ...

  4. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  5. 【刷题】洛谷 P1966 火柴排队

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...

  6. P3223 [HNOI2012]排队

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

  7. 洛谷 P1966 火柴排队 解题报告

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...

  8. 洛谷 P3224 [HNOI2012]永无乡 解题报告

    P3224 [HNOI2012]永无乡 题目描述 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 ...

  9. Luogu P3223 [HNOI2012]排队 组合

    本来做了一道  P4901 排队 后来发现自己做错题了...到也都是数学qwq 这题最恶心的就是两只(雾)老师. 那我们分类讨论: 1.两个老师之间是男生: $ A(n,n)*A(n+1,2)*A(n ...

随机推荐

  1. predis操作大全

    predis是php连接redis的操作库,由于它完全使用php编写,大量使用命名空间以及闭包等功能,只支持php5.3以上版本,故实测性能一般,每秒25000次读写,相信改换c语言编写的php扩展后 ...

  2. Kattis - sortofsorting 【排序】

    题意 给出一系列字符串,然后要排序 排序规则 只按前两位按字典序来排序,如果前两位完全一样,则按输入的顺序来排 思路 要用 冒泡排序 不能用STL里面的 SORT 因为它不稳定 AC代码 #inclu ...

  3. Loadrunder之脚本篇——参数化在场景中的运用

    Action() { lr_eval_string("{NewParam}"); lr_eval_string("{NewParam}"); return 0; ...

  4. Django---view视图FBV&CBV

    一:创建项目和应用: 或者用命令创建: 1:django-admin.py startproject CBV&FBV 2: cd CBV&FBV (路径切到该文件夹下) 3: pyth ...

  5. 基于SSM的单点登陆03

    TbUser.java和TbUserExample.java,TbUserMapper.java,TbUserMapper.xml由mybatis框架生成. generatorConfig.xml & ...

  6. python之json模块的基本使用

    json模块的作用:将字符串和字典相互转换 json和eval的区别: eval函数不能识别null转换成None json可以将null转换成python可以识别的None json序列化和反序列化 ...

  7. Django详解之四、cookie和session

    一.使用背景 思路 简单的后台管理:对人员的管理 1. 登录注册 2. 老师 班级管理 学院管理 3. 增删改查 开发: 1. 定义数据库表结构 a) 表结构关系 i. class classes(m ...

  8. INSPIRED启示录 读书笔记 - 第4章 产品管理与产品设计

    理解用户体验设计 1.用户研究:专门研究.分析用户,评估产品或产品原型是否符合特定用户的使用习惯.其具体工作包括拟订恰当的测试项目,监督测试,评估测试结果,提出改进方案 2.交互设计:在理解目标用户的 ...

  9. MongoDB快速入门(二)- 数据库

    创建数据库 MongoDB use DATABASE_NAME 用于创建数据库.该命令如果数据库不存在,将创建一个新的数据库, 否则将返回现有的数据库. 语法 use DATABASE语句的基本语法如 ...

  10. C++中随机数的生成

    1.随机数由生成器和分布器结合产生 生成器generator:能够产生离散的等可能分布数值 分布器distributions: 能够把generator产生的均匀分布值映射到其他常见分布,如均匀分布u ...