题目描述 Description
某中学有n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入描述 Input Description
输入文件只有一行且为用空格隔开的两个非负整数n 和m,其含义如上所述。 输出描述 Output Description
仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。 样例输入 Sample Input
样例输入1 样例输入2 样例输出 Sample Output 样例输出1 样例输出2 数据范围及提示 Data Size & Hint
对于30%的数据n≤,m≤
对于100%的数据n≤,m≤

题目

这里插空法+高精度重载,我的公式就是ans=A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1)

先让n个男生站好,让两个老师插n+1个空,再让女生插n+3个空,但是忽略了老师和女生站在一起的情况——两个老师中间夹着一个女生。再让n个男生站好,在女生里选出一个来站在老师中间,老师的位置可以互换。这三个人可以在n+1个空里选一个去站。现在还剩m-1个女生,n+2个空,再让她们去随便站就好啦。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#define mod 100000000
#define ll long long
using namespace std;
struct NUM
{
vector<ll>val;
NUM(){val.clear();val.resize(,);}
void clear(){while(!val.back()&&val.size()>) val.pop_back();}
NUM operator+(NUM b)
{
NUM a=*this,c;
int len1=a.val.size();
int len2=b.val.size();
int len3=max(len1,len2)+;
c.val.resize(len3,);
for(int i=;i<len3;++i){
if(i<len1) c.val[i]+=a.val[i];
if(i<len2) c.val[i]+=b.val[i];
if(i<len3-){
c.val[i+]+=c.val[i]/mod;
c.val[i]%=mod;
}
}
c.clear();
return c;
}
NUM operator*(const int x){
NUM a=*this;
int ret=;
for(int i=;i<a.val.size();++i){
a.val[i]*=x;
a.val[i]+=ret;
ret=a.val[i]/mod;
a.val[i]%=mod;
}
a.val.push_back(ret);
a.clear();
return a;
}
NUM operator*(NUM b)
{
NUM a=*this,c;
int len1=a.val.size();
int len2=b.val.size();
int len3=len1+len2;
c.val.resize(len3,);
for(int i=;i<len1;++i)
for(int j=;j<len2;++j)
c.val[i+j]+=a.val[i]*b.val[j];
for(int i=;i<len3-;++i){
c.val[i+]+=c.val[i]/mod;
c.val[i]%=mod;
}
c.clear();
return c;
}
NUM operator/(const int x){
NUM a=*this,b;
int len=a.val.size();
b.val.resize(len,);
for(int i=len-;i>=;--i){
b.val[i]=a.val[i]/x;
a.val[i-]+=a.val[i]%x*mod;
}
b.val[]=a.val[]/x;
b.clear();
return b;
}
NUM operator*=(const int x){return *this=*this*x;}
NUM operator/=(const int x){return *this=*this/x;}
void output(){
int len=val.size();
if(val[len-]) printf("%d",val[len-]);
for(int i=len-;i>=;--i) printf("%08d",val[i]);
}
};
NUM A(int n,int m)
{
NUM zero;
if(m>n) return zero;
NUM ret;
ret.val[]=;
for(int i=n-m+;i<=n;++i) ret*=i;
return ret;
}
NUM C(int n,int m)
{
NUM zero;
if(m>n) return zero;
NUM ret;
ret.val[]=;
for(int i=n-m+;i<=n;++i) ret*=i;
for(int i=;i<=m;++i) ret/=i;
return ret;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
if(!n&&!m){
printf("");
return ;
}
NUM ans=A(n,n)*A(n+,)*A(n+,m)+A(n,n)*C(m,)*A(,)*C(n+,)*A(n+,m-);
ans.output();
return ;
}

HNOI 2012/codevs 1994:排队的更多相关文章

  1. codevs 1994 排队 排列组合+高精度

    /* 数学题0.0 最后答案:A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1); 简单解释一下 +之前的很显然 先排男 ...

  2. HNOI 2012 永无乡

    codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛  时间限制: 1 s  空间限制: 128000 KB   题目描述 Des ...

  3. 【BZOJ 2733】【HNOI 2012】永无乡 Splay启发式合并

    启发式合并而已啦,, 调试时发现的错误点:insert后没有splay,把要拆开的树的点插入另一个树时没有把ch[2]和fa设为null,找第k大时没有先减k,,, 都是常犯的错误,比赛时再这么粗心就 ...

  4. BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并

    题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...

  5. HNOI 2012 矿场搭建

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #def ...

  6. [HNOI 2012]集合选数

    Description 题库链接 对于任意一个正整数 \(n\) ,求出集合 \(\{1,2,\cdots,n\}\) 的满足约束条件"若 \(x\) 在该子集中,则 \(2x\) 和 \( ...

  7. [BZOJ 2730][HNOI 2012] 矿场搭建

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2113  Solved: 979[Submit][Statu ...

  8. 解题:HNOI 2012 永无乡

    题面 并查集维护连通性,然后暴力启发式合并就完了,记得合并时边DFS边清空数组 #include<cstdio> #include<cstring> #include<a ...

  9. 「BZOJ 2733」「HNOI 2012」永无乡「启发式合并」

    题意 你需要维护若干连通快,有两个操作 合并\(x,y\)所在的连通块 询问\(x\)所在连通块中权值从小到大排第\(k\)的结点编号 题解 可以启发式合并\(splay\),感觉比较好些的 一个连通 ...

随机推荐

  1. CAZAC序列

    定义: CAZAC(Const Amplitude Zero Auto-Corelation),即为恒包络零自相关序列. 性质: 1,恒包络特性:任意长度的CAZAC序列幅值恒定. 2,理想的周期自相 ...

  2. soapui如何发送xml格式的字符串

    一个服务需要的xml格式的字符串参数,用soapUI传递参数时要这样写: <![CDATA[<?xml version="1.0" encoding="UTF ...

  3. 启动文件startup_stm32f40_41xxx.s

    一.启动文件,startup_stm32f40x_41xx.s 1.定义 启动文件由汇编编写,是系统上电复位后第一执行的程序. Stack_Size EQU 0x00000400 // 栈的大小可以调 ...

  4. eclipse-jee-luna安装ADT-23.0.6出现的问题,以及解决办法

    刚安装好ADT-23.0.6,然后配置sdk路径(最新的版本android-22),然后创建一个新的Android Project; 对于布局界面会出现如下错误,导致无法显示布局界面: java.la ...

  5. c 判断是否为 字母或数字(iswalnum example)

    #include <stdio.h> #include <wctype.h> int main () { int i; wchar_t str[] = L"c3p.o ...

  6. UOJ #164 [清华集训2015]V (线段树)

    题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...

  7. 图论——最短路:Floyd,Dijkstra,Bellman-Ford,SPFA算法及最小环问题

    一.Floyd算法 用于计算任意两个节点之间的最短路径. 参考了five20的博客 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个 ...

  8. 解决Android Studio 打开Flutter 项目,找不到设备的问题

    开始设置了ANDROID_HOME环境变量后,发现Flutter 识别不了安卓SDK, 使用命令配置发现配置是失败的,貌似是不支持路径里有空格 复制一份SDK到没有空格的路径后,SDK就能识别了,并且 ...

  9. docker 部署 .net core

    1.centos安装好sdk2.1,安装好docker,这些基本的操作就不赘述. 2.准备好core项目,版本2.1 3.新建dockerfile文件放到项目发布文件夹里,里面内容如下: FROM m ...

  10. nodeJS 项目如何运行

    nodeJS 项目如何运行 一.总结 一句话总结: nodejs项目根目录中用node xx.js 或是 node xx运行 打开 window的 cmd 命令窗口,使用 cd 命令跳转到 nodeJ ...