HNOI 2012/codevs 1994:排队
题目描述 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:排队的更多相关文章
- 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); 简单解释一下 +之前的很显然 先排男 ...
- HNOI 2012 永无乡
codevs 1477 永无乡 http://codevs.cn/problem/1477/ 2012年湖南湖北省队选拔赛 时间限制: 1 s 空间限制: 128000 KB 题目描述 Des ...
- 【BZOJ 2733】【HNOI 2012】永无乡 Splay启发式合并
启发式合并而已啦,, 调试时发现的错误点:insert后没有splay,把要拆开的树的点插入另一个树时没有把ch[2]和fa设为null,找第k大时没有先减k,,, 都是常犯的错误,比赛时再这么粗心就 ...
- BZOJ 2733 HNOI 2012 永无乡 平衡树启示式合并
题目大意:有一些岛屿,一開始由一些无向边连接. 后来也有不断的无向边增加,每个岛屿有个一独一无二的重要度,问随意时刻的与一个岛屿联通的全部岛中重要度第k大的岛的编号是什么. 思路:首先连通性一定要用并 ...
- HNOI 2012 矿场搭建
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #def ...
- [HNOI 2012]集合选数
Description 题库链接 对于任意一个正整数 \(n\) ,求出集合 \(\{1,2,\cdots,n\}\) 的满足约束条件"若 \(x\) 在该子集中,则 \(2x\) 和 \( ...
- [BZOJ 2730][HNOI 2012] 矿场搭建
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2113 Solved: 979[Submit][Statu ...
- 解题:HNOI 2012 永无乡
题面 并查集维护连通性,然后暴力启发式合并就完了,记得合并时边DFS边清空数组 #include<cstdio> #include<cstring> #include<a ...
- 「BZOJ 2733」「HNOI 2012」永无乡「启发式合并」
题意 你需要维护若干连通快,有两个操作 合并\(x,y\)所在的连通块 询问\(x\)所在连通块中权值从小到大排第\(k\)的结点编号 题解 可以启发式合并\(splay\),感觉比较好些的 一个连通 ...
随机推荐
- 【转】解决 canvas 在高清屏中绘制模糊的问题
来源: http://www.css88.com/archives/9297 使用 canvas 绘制图片或者是文字在 Retina 屏中会非常模糊.如图: 因为 canvas 不是矢量图,而是像图片 ...
- 一个奇怪的方法解决华为ENSP模拟器路由器启动后命令行一直“#”的问题
今天打开ensp准备练习一下,设备启动以后发现端口一直是红色.于是打开路由器命令行,发现一直输出“#”号.百度后几乎试了所有方法,什么删除网卡再新建.重启计时器.配置ip地址..都不行. 可是我昨天用 ...
- .Net Core:Middleware自定义中间件
新建standard类库项目,添加引用包 Microsoft.AspNetCore 1.扩展IApplicationBuilder using Microsoft.AspNetCore.Builder ...
- JQuery实践--Ajax
Ajax概览无需刷新用户页面而发起服务器请求的技术.创建一个XHR实例: var xhr if(window.XMLHttpRequest) { xhr = new XML ...
- Vivado RAM使用
RAM使用的几点说明: 1,RAM的读写位宽可以不同,举例:写的位宽为8(1Byte),读的位宽为1(1bit),那么读的地址就变成了写地址的8倍,即位宽增加3bit.
- Linux 不同方法查看进程消耗CPU IO 等
1.用top命令指定固定的PID top -p 10997 查询指定进程的PID ps -ef | grep zookeeper jim 10997 1959 0 12月14 pts/2 00:00: ...
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- 【csp模拟赛6】树上统计-启发式合并,线段树合并
30%:暴力 40%:枚举L,R从L~n枚举,R每增大一个,更新需要的边(bfs实现)60%:枚举每条边, 计算每条边的贡献另外20%的数据:枚举每条边,计算每条边的贡献100%:对于每一条边统计 有 ...
- css偷懒神奇
偷懒神奇链接:https://qishaoxuan.github.io/css_tricks/glass/
- 小程序开发:用原生还是选框架(wepy/mpvue/uni-app/taro)?
小程序开发:用原生还是选框架(wepy/mpvue/uni-app/taro)? 自 2017-1-9微信小程序诞生以来,历经2年多的迭代升级,已有数百万小程序上线,成为继Web.iOS.Androi ...