题目描述 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. python自动华 (六)

    Python自动化 [第六篇]:Python基础-面向对象   目录: 面向过程VS面向对象 面向对象编程介绍 为什么要用面向对象进行开发 面向对象的特性:封装.继承.多态 面向过程 VS 面向对象 ...

  2. 关系型数据库与NoSQL的对比

    SQL(结构化的查询语言)数据库是过去四十年间存储数据的主要方式.20世纪90年代末随着Web应用和MySQL.PostgreSQL和SQLite等开源数据库的兴起,用户爆炸式的增长. NoSQL数据 ...

  3. 【组合数学】OI内的排列与组合(简单版)

    §1基本原理 △让我们来看下面问题: 从甲地到乙地,可以乘火车,也可以乘汽车,还可以乘轮船.一天中,火车有4班,汽车有2班,轮船有3班.那么,一天中乘坐这些交通工具从甲地到乙地共有多少种不同走法?△分 ...

  4. Codeforces 1276C/1277F/1259F Beautiful Rectangle (构造)

    题目链接 http://codeforces.com/contest/1276/problem/C 题解 嗯,比赛结束前3min想到做法然后rush不出来了--比赛结束后又写了15min才过-- 以下 ...

  5. Spring Cloud Config(二):基于Git搭建配置中心

    1.简述 本文选用Git作为配置仓库,新建两个环境的配置文件夹,dev 和 test,文件夹中分别存放 Config Client 端的配置文件,目录结构如下: ├ ─ ─ dev └ ─ ─ con ...

  6. Hive 参数

    hive.exec.max.created.files •说明:所有hive运行的map与reduce任务可以产生的文件的和 •默认值:100000  hive.exec.dynamic.partit ...

  7. 数据库安装后无法访问且mysql重启报错的解决方法

    数据库安装后无法访问,mysql重启报错: 或报错:MySQL is running but PID file could not be found 解决方法: 第一种方法:看磁盘是否已满:df –h ...

  8. 阿里前端实习生面试总结(两轮技术面+一轮hr面)

    投的蚂蚁金服: 一面(只有13分钟): 1.angular里双向绑定的实现原理: 巴拉巴拉巴拉,这个问题很常见,我提到了$scope.$apply()和$scope.$digest(),面试官问app ...

  9. 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...

  10. PHP学习之文件上传类

    <?php $up = new Upload(); $newPath = $up->uploadFile('fm'); if ($newPath === false) { var_dump ...