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. EF6 CodeFirst代码迁移笔记

        由于EF7只支持codefirst only.朕无奈被微软逼上了梁山学一下codefirst,就算是为明年做准备吧.写的这些网上大致都有,基本没啥 新内容, 迁移 使用自动迁移 Enable- ...

  2. CentOS 忘记root密码(重置root密码)

    首先开机选择Advanced options for ****这一行按回车: 然后选中最后是(recovery mode)这一行按"E"进入编辑页面: 将ro recovery改为 ...

  3. GC详解及Minor GC和Full GC触发条件总结

    GC,即就是Java垃圾回收机制.目前主流的JVM(HotSpot)采用的是分代收集算法.与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用.即:从gcroot开始 ...

  4. EF CodeFirst 初识

    随着EntityFramework的发展,原先的三种方式,{Code First ,Model First,Database First }  CodeFirst基本摆脱了另外两种方式 成为了 最受欢 ...

  5. webstorm修改文件,webpack-dev-server及roadhog不会自动编译刷新

    转自:http://www.cnblogs.com/ssrsblogs/p/6155747.html 重装了 webstorm ,从10升级到了2016 一升不要紧,打开老项目,开启webpakc-d ...

  6. 第二十天- 多继承 经典MRO 新式MRO super()

    # 多继承:# 在继承关系中.⼦类自动拥有⽗类中除私有属性外其他所有内容.python⽀持多继承.子类可拥有多⽗类. class ShenXian: # 神仙 def fei(self): print ...

  7. 2 python全局变量如何指定(是在模块内,还是函数内)

    示例代码1 xx=1 def __recurrence(): # #前面的0到sentence_length-1的下标,存储的就是最原始的词向量,但是我们也要将其转变为Tensor global xx ...

  8. 【转】虚拟机安装Ubuntu的上网设置(有线网络和无线网络)

    虚拟机下ubuntu共享方式上网: 一. 有线网络 在有线网络的条件下,vmware的安装非常简单,上网方式几乎不用怎么设置(默认NAT模式)    如果默认情况下不能上网,则按以下步骤尝试: *** ...

  9. Android笔记:解决 Your project contains error(s),please fix them before running your application问题

    解决 Your project contains error(s),please fix them before running your application问题 貌似好多人都有遇到这问题,而且网 ...

  10. mongodb存储引擎

    存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始,MongoDB 支持多数据存储引 ...