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] ...
随机推荐
- java SE 入门之语言与环境(第一篇)
Javase的语言与开发环境Keke2016年03月08日 Java属于-Oracle公司(甲骨文)创始人:Gosling1995年诞生1998年12月发布jdk1.22002年2月发布:jdk1.4 ...
- webAPP 图片上传
关于webAPP 手机上传 用的vue.js 首先是js代码 调用手机app 的 相册或者自己拍照 upload: function(index) { //上传 this.index = index ...
- Java Swing实战(一)JFrame和JTabbedPane容器
概述: 项目是一个桌面程序,涉及标签和按钮组件.布局管理器组件.面板组件.列表框和下拉框组件等组件,以及Swing事件处理机制. 下面先从最基础的界面开始. /** * @author: lishua ...
- Java Web整合开发王者归来(JSP + Servlet + Struts + Hibernate + Spring) - 读书笔记
第1章 状态码表示响应类型: 保留 表示请求成功地接收 完成请求客户需进一步细化请求 客户错误 服务器错误 Web服务器: Apache服务器,特长是处理静态页面,效率非常高. Tomcat提供对JS ...
- css3中Animation
CSS3我在5年之前就有用了,包括公司项目都一直在很前沿的技术. 最近在写慕课网的七夕主题,用了大量的CSS3动画,但是真的沉淀下来仔细的去深入CSS3动画的各个属性发现还是很深的,这里就写下关于帧动 ...
- 原生webview 日期格式转时间戳兼容问题
需要根据后端返回的日期格式返回相应时间戳 后端返回的数据格式: let dateStr = 2019-04-19T10:39:10.000+0000; 直接new Date(dateStr ).g ...
- x86项目中读取注册表Register数据项的方法
x86项目中使用Registry读取key/value的时候,会出现重定向的问题,解决方法如下: public static string GetMachineGuid() { string guid ...
- Object.defineProperty 与数据绑定的简单实现
对象是一个属性集合,对象的基本特征是属性名(name)和属性值(value).ES5 增加了属性描述符,包括数据属性描述符(configurable enumerable writable value ...
- Android CheckBox大小调整
关键是: android:scaleX="0.5" <CheckBox android:id="@+id/checkBox1" android:layou ...
- windows 7 Alt+Tab 的风格改成 XP 风格
1.开始菜单-运行-输入“regedit”. 2.找到这个位置“[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explore ...