BZOJ2729:[HNOI2012]排队(组合数学)
Description
Input
Output
Sample Input
Sample Output
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]排队(组合数学)的更多相关文章
- 【bzoj2729】[HNOI2012]排队 组合数学+高精度
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入 ...
- [BZOJ2729]:[HNOI2012]排队(组合数学)
题目传送门 题目描述 某中学有n名男同学,m名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) ...
- BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】
题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...
- BZOJ2729 HNOI2012排队(组合数学+高精度)
组合入门题.高精度入门题. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...
- bzoj2729 [HNOI2012]排队
组合数学,推一下式子,并不难推. java代码 import java.io.*; import java.math.BigInteger; import java.util.*; public cl ...
- [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- 【BZOJ2729】[HNOI2012]排队 组合数
[BZOJ2729][HNOI2012]排队 Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那 ...
- bzoj 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MB Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体 ...
- 2729: [HNOI2012]排队
2729: [HNOI2012]排队 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 957 Solved: 449[Submit][Status] ...
随机推荐
- css3 transition(转换)笔记
之前transition也用过,大都是ctrl+c,然后ctrl+v,没有了解太详细,这次对transition的应用源自侧边抽屉展开收起的动画效果需要. W3C标准中对css3的transition ...
- 《码出高效 Java开发手册》第一章计算机基础(未整理)
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding
- SpringBoot(七) Working with data: SQL
一.JdbcTemplate 二.Spring-data-jpa 实体类 继承JpaRepository<T,ID> 的接口,来访问数据库 30.3 JPA and Spring Data ...
- Tomcat配置JVM参数步骤
这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...
- 【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式
1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换 2. 生成器函数: 函数中包含了yield的就是生成 ...
- 项目小结:手机邮箱正则,URL各种判断返回页面,input输入框输入符合却获取不到问题
1.手机邮箱正则 近两年出来很多新号码,听说199什么的都有了- -导致以前的正则不能用了....这就很难过,总是过一段时间出一种新号码.因此,我决定使用返朴归真的手机正则. 手机正则:var reg ...
- Android Studio最全插件整理
在Android开发中,合理的使用Android Studio插件不但可以提高开发效率,还能从整体上提高代码的质量.下面就Android开发中常见的一些插件做一个整理. 1,GsonFormatGso ...
- 如何在C/S下打印报表
java应用有不少是C/S模式,在C/S模式下,同样可以调用API接口运算报表.CSReport是C/S模式下的报表控件类,在这个类中可以获得报表的显示面板.获得报表的打印面板.显示报表打印窗口 ...
- main方法之args参数
public class Demo { public static void main (String[] arr) { if (arr.length < 3) { System.out.pri ...
- h5调用微信分享
https://blog.csdn.net/qq_39562787/article/details/79217386