Description

某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
 

Input

只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
 
对于 30%的数据 n≤100,m≤100
 
对于 100%的数据 n≤2000,m≤2000

Output

输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。

Sample Input

1 1

Sample Output

12

Solution

一种情况是两个老师中间只有一个人且这个人是女生。

即$A(n,n)*A(n+1,1)*A(2,2)*A(m,1)*A(n+2,m-1)$

另一种情况是两个老师中间不是只有一个女生,也就是两个老师中间一定有男生。

即$A(n,n)*A(n+1,2)*A(n+3,m)$

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX_L 20005
using namespace std; class bign
{
public:
int len, s[MAX_L];
bign();
bign(const char*);
bign(int);
bool sign;
string toStr() const;
friend istream& operator>>(istream &,bign &);
friend ostream& operator<<(ostream &,bign &);
bign operator=(const char*);
bign operator=(int);
bign operator=(const string);
bool operator>(const bign &) const;
bool operator>=(const bign &) const;
bool operator<(const bign &) const;
bool operator<=(const bign &) const;
bool operator==(const bign &) const;
bool operator!=(const bign &) const;
bign operator+(const bign &) const;
bign operator++();
bign operator++(int);
bign operator+=(const bign&);
bign operator-(const bign &) const;
bign operator--();
bign operator--(int);
bign operator-=(const bign&);
bign operator*(const bign &)const;
bign operator*(const int num)const;
bign operator*=(const bign&);
bign operator/(const bign&)const;
bign operator/=(const bign&);
bign operator%(const bign&)const;
bign factorial()const;
bign Sqrt()const;
bign pow(const bign&)const;
void clean();
~bign();
}; bign::bign()
{
memset(s,,sizeof(s));
len=;
sign=;
} bign::bign(const char *num)
{
*this=num;
} bign::bign(int num)
{
*this=num;
} string bign::toStr() const
{
string res;
res="";
for (int i=; i<len; i++)
res=(char)(s[i]+'')+res;
if (res=="")
res="";
if (!sign&&res!="")
res="-"+res;
return res;
} istream &operator>>(istream &in, bign &num)
{
string str;
in>>str;
num=str;
return in;
} ostream &operator<<(ostream &out, bign &num)
{
out<<num.toStr();
return out;
} bign bign::operator=(const char *num)
{
memset(s,,sizeof(s));
char a[MAX_L]="";
if (num[]!='-')
strcpy(a,num);
else
for (int i=,l=strlen(num); i<l; i++)
a[i-]=num[i];
sign=!(num[]=='-');
len=strlen(a);
for (int i=; i<strlen(a); i++)
s[i]=a[len-i-]-;
return *this;
} bign bign::operator=(int num)
{
char temp[MAX_L];
sprintf(temp,"%d",num);
*this=temp;
return *this;
} bign bign::operator=(const string num)
{
const char *tmp;
tmp=num.c_str();
*this=tmp;
return *this;
} bool bign::operator<(const bign &num) const
{
if (sign^num.sign)
return num.sign;
if (len!=num.len)
return len<num.len;
for (int i=len-; i>=; i--)
if (s[i]!=num.s[i])
return sign?(s[i]<num.s[i]):(!(s[i]<num.s[i]));
return !sign;
} bool bign::operator>(const bign&num)const
{
return num<*this;
} bool bign::operator<=(const bign&num)const
{
return !(*this>num);
} bool bign::operator>=(const bign&num)const
{
return !(*this<num);
} bool bign::operator!=(const bign&num)const
{
return *this>num || *this<num;
} bool bign::operator==(const bign&num)const
{
return !(num!=*this);
} bign bign::operator+(const bign &num) const
{
if (sign^num.sign)
{
bign tmp=sign?num:*this;
tmp.sign=;
return sign?*this-tmp:num-tmp;
}
bign result;
result.len=;
int temp=;
for (int i=; temp || i<(max(len, num.len)); i++)
{
int t=s[i]+num.s[i]+temp;
result.s[result.len++]=t % ;
temp=t/;
}
result.sign=sign;
return result;
} bign bign::operator++()
{
*this=*this+;
return *this;
} bign bign::operator++(int)
{
bign old=*this;
++(*this);
return old;
} bign bign::operator+=(const bign &num)
{
*this=*this+num;
return *this;
} bign bign::operator-(const bign &num) const
{
bign b=num,a=*this;
if (!num.sign && !sign)
{
b.sign=;
a.sign=;
return b-a;
}
if (!b.sign)
{
b.sign=;
return a+b;
}
if (!a.sign)
{
a.sign=;
b=bign()-(a+b);
return b;
}
if (a<b)
{
bign c=(b-a);
c.sign=false;
return c;
}
bign result;
result.len=;
for (int i=, g=; i<a.len; i++)
{
int x=a.s[i]-g;
if (i<b.len) x -= b.s[i];
if (x >= ) g=;
else
{
g=;
x += ;
}
result.s[result.len++]=x;
}
result.clean();
return result;
} bign bign::operator * (const bign &num)const
{
bign result;
result.len=len+num.len; for (int i=; i<len; i++)
for (int j=; j<num.len; j++)
result.s[i+j] += s[i] * num.s[j]; for (int i=; i<result.len; i++)
{
result.s[i+] += result.s[i]/;
result.s[i] %= ;
}
result.clean();
result.sign=!(sign^num.sign);
return result;
} bign bign::operator*(const int num)const
{
bign x=num;
bign z=*this;
return x*z;
}
bign bign::operator*=(const bign&num)
{
*this=*this * num;
return *this;
} bign bign::operator /(const bign&num)const
{
bign ans;
ans.len=len-num.len+;
if (ans.len<)
{
ans.len=;
return ans;
} bign divisor=*this, divid=num;
divisor.sign=divid.sign=;
int k=ans.len-;
int j=len-;
while (k >= )
{
while (divisor.s[j]==) j--;
if (k > j) k=j;
char z[MAX_L];
memset(z, , sizeof(z));
for (int i=j; i >= k; i--)
z[j-i]=divisor.s[i]+'';
bign dividend=z;
if (dividend<divid)
{
k--;
continue;
}
int key=;
while (divid*key <= dividend) key++;
key--;
ans.s[k]=key;
bign temp=divid*key;
for (int i=; i<k; i++)
temp=temp * ;
divisor=divisor-temp;
k--;
}
ans.clean();
ans.sign=!(sign^num.sign);
return ans;
} bign bign::operator/=(const bign&num)
{
*this=*this/num;
return *this;
} bign bign::operator%(const bign& num)const
{
bign a=*this, b=num;
a.sign=b.sign=;
bign result, temp=a/b*b;
result=a-temp;
result.sign=sign;
return result;
} bign bign::pow(const bign& num)const
{
bign result=;
for (bign i=; i<num; i++)
result=result*(*this);
return result;
} bign bign::factorial()const
{
bign result=;
for (bign i=; i <= *this; i++)
result*=i;
return result;
} void bign::clean()
{
if (len==) len++;
while (len> && s[len-]=='\0')
len--;
} bign bign::Sqrt()const
{
if(*this<)return -;
if(*this<=)return *this;
bign l=,r=*this,mid;
while(r-l>)
{
mid=(l+r)/;
if(mid*mid>*this) r=mid;
else l=mid;
}
return l;
} bign::~bign()
{
} bign A(int n,int m)
{
bign ans;
ans=;
for (int i=n-m+; i<=n; ++i) ans*=i;
return ans;
} int n,m; int main()
{
scanf("%d%d",&n,&m);
bign ans=A(n,n)*A(n+,)*A(n+,m)+A(n,n)*A(n+,)*A(,)*A(m,)*A(n+,m-);
cout<<ans;
}

BZOJ2729:[HNOI2012]排队(组合数学)的更多相关文章

  1. 【bzoj2729】[HNOI2012]排队 组合数学+高精度

    题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入 ...

  2. [BZOJ2729]:[HNOI2012]排队(组合数学)

    题目传送门 题目描述 某中学有n名男同学,m名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) ...

  3. BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】

    题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...

  4. BZOJ2729 HNOI2012排队(组合数学+高精度)

    组合入门题.高精度入门题. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...

  5. bzoj2729 [HNOI2012]排队

    组合数学,推一下式子,并不难推. java代码 import java.io.*; import java.math.BigInteger; import java.util.*; public cl ...

  6. [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  7. 【BZOJ2729】[HNOI2012]排队 组合数

    [BZOJ2729][HNOI2012]排队 Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那 ...

  8. bzoj 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...

  9. 2729: [HNOI2012]排队

    2729: [HNOI2012]排队 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 957  Solved: 449[Submit][Status] ...

随机推荐

  1. vps服务器搭建——Linode VPS 20美元优惠获取教程

    转载:http://www.cuishifeng.cn/linode/index.html?v=2 声明:本文旨在教大家怎么获得linode 20美元优惠,并免费使用4个月vps,请低调薅羊毛!(多张 ...

  2. CentOS如何挂载U盘(待更新)

    使用Linux系统时,经常需要用到U盘,下面介绍以下如何再CentOS上挂载U盘. 首先,切换到root用户. 首先,切换到root用户. 首先,切换到root用户. 重要的事情说三遍,很多同学都说, ...

  3. Eclipse下安装SVN插件以及连接SVN服务并发布项目

    Eclipse安装SVN插件 Help->Eclipse MarketPlace 查找并安装Subclipse插件 按默认步骤完成SVNEclipse插件的安装(安装完成后需要重启Eclipse ...

  4. JVM进程状态监控

    前言 ========== 为什么需要做服务器jvm自动发现的监控呢?这个事情主要有两点原因: 1.zabbix默认监控jvm状态是使用jmx中转进行监控的,监控效率比较低下 2.zabbix使用jm ...

  5. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  6. JAVA 判断字符串是否可转化为JSONObject、JSONArray

    有时,我们需要判断字符串在转化为JSON对象或者JSONArray时,我们可以使用JSONObject.parseObject和JSONArray.parseArray,但是有时候我们需要在转化之前判 ...

  7. vs2017 + Python3.6 +Django1.11 连接mysql数据库

    不废话直接来. vs2017创建一个新的python web项目之后默认链接数据库是sqlite.但是我就想连接到Mysql 上面玩,于是开始倒腾了.下面是步骤 1.修改settings.py 文件需 ...

  8. vue 面试时需要准备的知识点

    前端火热的框架层出不穷,作为码农的我们,依旧需要去学习,去探索新的问题,学习新技术,其实就是为了写一手好的,自认为是高质量的代码.今天主要分享一下前端最火的框架vue,也是我比较喜欢的框架. vue上 ...

  9. oracle exp dmp

    exp help=yconn scott/tiger;select * from tab;create table student(sno int, sname varchar2(10), sage ...

  10. BS网站架构演变

    BS网站架构演变 网站架构的整个演变过程主要是围绕大数据和高并发这两个问题展开的,解决的方案主要分为使用缓存和使用多资源两种类型.多资源主要指多存储(包括多内存).多CPU和多网络,对于多资源来说又可 ...