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\),感觉比较好些的 一个连通 ...
随机推荐
- activemq的配置与结合spring使用
其实无论在win下还是在linux下,都可以运行得很爽 下载安装包地址: http://www.apache.org/dyn/closer.cgi?path=/activemq/5.12.1/apac ...
- 慕课网SSMOA办公系统
目录 需求分析 1 用例图 系统设计 包及全局配置 数据库设计 工具类 具体功能实现 1 dao层功能实现 2 编码过滤器及登陆拦截器 3 单元测试 遇到的问题总结 1 新建一个Modul不会打开新页 ...
- Shell 脚本来自动监控 Linux 系统的内存
# vim /scripts/swap-warning.sh #!/bin/bash #提取本服务器的IP地址信息 IP=`ifconfig eth0 | grep "inet addr&q ...
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H
比赛链接https://www.jisuanke.com/contest/3098?view=challenges B题 拉格朗日插值 题意 T组输入.一个n次多项式 f(x) ,每项的系数不知道, ...
- Codeforces 1276C/1277F/1259F Beautiful Rectangle (构造)
题目链接 http://codeforces.com/contest/1276/problem/C 题解 嗯,比赛结束前3min想到做法然后rush不出来了--比赛结束后又写了15min才过-- 以下 ...
- java试题复盘——9月26日
5.在 JAVA 编程中, Java 编译器会将 Java 程序转换为(A) A. 字节码 B. 可执行代码 C. 机器代码 D. 以上都不对 解析: 编译器将Java源代码编译成字节码cla ...
- UVALive 4726 Average ——(斜率优化DP)
这是第一次写斜率优化DP= =.具体的做法参照周源论文<浅谈数形结合思想在信息学竞赛中的应用>.这里仅提供一下AC的代码. 有两点值得注意:1.我这个队列的front和back都是闭区间的 ...
- elasticsearch java索引的增删改查
1.创建索引并插入数据 Map<String, Object> json = new HashMap<String, Object>(); json.put("use ...
- JAVA基础知识|内部类
一.什么是内部类? 内部类(inner class)是定义在另一个类中的类 为什么使用内部类? 1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据 2)内部类可以对同一个包中的其他类隐藏 ...
- 你的windows许可证即将过期
0xC004F025拒绝访问:所请求的操作需要提升特权:解决方法:1.打开我的电脑找到windows System32目录下的cmd 2.对windows System ...