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\),感觉比较好些的 一个连通 ...
随机推荐
- vue 配置CDN加速
1.首先index.html 中配置cdn 引入 <!-- 引入样式 --> <link rel="stylesheet" href="//cdn.bo ...
- java获取一段字符串里符合日期的正则表达式的字符串
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test3 { public static v ...
- js 跨域请求原理及常见解决方案
一.同源策略: 说到跨域请求,首先得说说同源策略: 1995年,同源政策是由 Netscape 公司引入浏览器的.目前,所有浏览器都实行了这个政策. 同源策略是浏览器的一种安全策略,所谓同源是指,域名 ...
- CodeForces - 999B Reversing Encryption
B - Reversing Encryption A string s of length n can be encrypted by the following algorithm: iterate ...
- 关于openstack 网络相关的文章收集
journalctl工具基础介绍(你需要这个的.) https://blog.51cto.com/13598893/2072212 新版devstack使用systemd的方式来管理OpenStack ...
- Send Boxes to Alice
E. Send Boxes to Alice 首先求出每一个位置的前缀和. 对答案进行复杂度为\(\sqrt{a[n]}\)的遍历,因为最后的答案不可能大于\(\sqrt{a[n]}\) for(ll ...
- JavaScript Call函数原理
call原理分析,一定要看最后的例子. 1.call使用例子 function add(c, d) { return this.a + this.b + c + d; } , b: }; consol ...
- Apache Flink -Streaming(DataStream API)
综述: 在Flink中DataStream程序是在数据流上实现了转换的常规程序. 1.示范程序 import org.apache.flink.api.common.functions.FlatMap ...
- tomcat单机多实例
catalina.home指向公用信息的位置,就是bin和lib的父目录. catalina.base指向每个Tomcat目录私有信息的位置,就是conf.logs.temp.webapps和work ...
- 批量停止、删除docker容器
批量停止 根据NAMES停止所有容器 docker stop `docker ps | awk 'NR!=1{print $NF}'` 根据CONTAINER ID停止所有容器 docker stop ...