BZOJ 2729: [HNOI2012]排队 排列组合 + 高精度
2024-08-27 11:10:51
Description
某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的)
Input
只有一行且为用空格隔开的两个非负整数 n 和 m,其含义如上所述。
对于 30%的数据 n≤100,m≤100
对于 100%的数据 n≤2000,m≤2000
Output
输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。
题解:不难的一道组合题
分类讨论一下:
(1) 老师由男生隔开
$A(n,n)\times A(n+1,2)\times A(n+3,m)$
(2) 老师由女生隔开
将两个老师中间夹一个女生视为一个整体
$A(n,n)\times A(n+1,1)\times A(n+2,m-1)$
最后累加一下即可
(1) 老师由男生隔开
$A(n,n)\times A(n+1,2)\times A(n+3,m)$
(2) 老师由女生隔开
将两个老师中间夹一个女生视为一个整体
$A(n,n)\times A(n+1,1)\times A(n+2,m-1)$
最后累加一下即可
#include<bits/stdc++.h>
#define maxn 10003
#define ll long long
#define p 10000000000ll
using namespace std;
ll base[maxn];
int n,m,len=1;
void multiply(int x)
{
ll pre=0,tmp;
for(int i=1;i<=len;i++)
{
tmp=base[i]*x;
base[i]=tmp%p+pre;
pre=tmp/p;
}
if(pre)++len, base[len]=pre;
}
int main(){
scanf("%d%d",&n,&m);
base[1]=1;
for(int i=1;i<=n;i++)multiply(i);
for(int i=n-m+4;i<=n+2;i++)multiply(i);
multiply(n+1);
multiply(n*(n+3)+2*m);
printf("%lld",base[len]);
while(--len)printf("%010lld",base[len]);
return 0;
}
最新文章
- [Data Structure] Bit-map空间压缩和快速排序去重
- Solr Python API : SolrCloudpy 与 Pysolr 的 对比
- centos 7.0安装花生壳
- OpenCV成长之路(10):视频的处理
- gcc【数学几何】
- C语言初学者代码中的常见错误与瑕疵(13)
- SQL Server 2012 批量重建索引
- Windbg CLR基础小测 《第六篇》
- Power of Four
- 【翻译】Sencha Touch2.4 The Layout System 布局
- 自动化测试平台CATP
- Python学习笔记——基础篇【第二周】——解释器、字符串、列表、字典、主文件判断、对象
- JAVAEE——SSH项目实战02:客户列表和BaseDao封装
- erlang 删除老版本 安装新版本
- [sharepoint]Rest api相关知识(转)
- spring jdbc连接数据库
- 43、ThreadPool 、WaitHandle、原子操作InterLocked
- 接口测试Jmeter+Fiddler组合
- centos使用boost过程
- Android Studio 2.3.2 下载 - 百度网盘
热门文章
- 使用@Value注解对bean进行属性注入
- Delphi XE2 之 FireMonkey 入门(24) - 数据绑定: TBindingsList: TBindExpression.Direction
- prometheus linux系统告警规则 实例
- failed to create process ,pip报错问题
- 好的计数思想-LightOj 1213 - Fantasy of a Summation
- tips for using shortcuts
- JavaSE编码试题强化练习4
- Airbnb开源 快速搭建企业级BI数据平台
- String.indexOf()的使用方法
- BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)