[HNOI2012]排队 组合数
公式:A(n,n)*A(n+1,2)*A(n+3,m) + A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1)
分情况讨论推出公式
前者为无论何时都合法的,后者为先不合法,然后再合法的(两个老师先站在一 起,然后一个女生
插进来,所以要把这3个人看成一个整体,然后老师可以左右换,所以乘2,女生 就是m选1,然后整体再插入队伍
最后得到上面的式子
由于答案较大,所以要写高精
#include<bits/stdc++.h>
using namespace std;
#define AC 10000
#define R register int
#define D printf("the k is %d\n",k);
/*A(n,n)*A(n+1,2)*A(n+3,m) + A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1)
分情况讨论推出公式
前者为无论何时都合法的,后者为先不合法,然后再合法的(两个老师先站在一 起,然后一个女生
插进来,所以要把这3个人看成一个整体,然后老师可以左右换,所以乘2,女生 就是m选1,然后整体再插入队伍
最后得到上面的式子
*/
int sum2[AC],a[AC],sum1[AC],k,n,m,tot,tot1,tot2,ans[AC];//每次计 算前将memset a,将高精sum*低精k存入a,然后计算完毕后将a导入sum void ADD()//加法
{
for(R i=;i<=max(tot1,tot2);i++)//error!!!注意这里要加到max(tot1,tot2)!!!
{
ans[i+]=ans[i+]+(sum1[i]+sum2[i]+ans[i])/;
ans[i]=(ans[i]+sum1[i]+sum2[i])%;
}
tot=(tot1+tot2)%;
while(!ans[tot] && tot>)--tot;//注意边界!!!
} void add1()//乘法1,计算前一部分
{
memset(a,,sizeof(a));
for(R i=;i<=tot1;i++)
{
a[i+]=a[i+]+(a[i]+sum1[i]*k)/;
a[i]=(a[i]+sum1[i]*k)%;
}
tot1+=;//因为n和m最大就是2000,所以最多也就加这么多位了,又因为压了位,,,所以
while(!a[tot1] && tot1>)--tot1;
if(!a[tot1])memset(sum1,,sizeof(sum1));//如果女生太多了会导致没有合法情况!!
else for(R i=;i<=tot1;i++) sum1[i]=a[i];//导入sum
} void add2()//乘法2,计算后一部分
{
memset(a,,sizeof(a));
for(R i=;i<=tot2;i++)
{
a[i+]=a[i+]+(a[i]+sum2[i]*k)/;
a[i]=(a[i]+sum2[i]*k)%;
}
tot2+=;//因为n和m最大就是2000,所以最多也就加这么多位了,又因为压了位,,,所以
while(!a[tot2] && tot2>)--tot2;
if(!a[tot2])memset(sum2,,sizeof(sum2));
else for(R i=;i<=tot2;i++) sum2[i]=a[i];//导入sum
} void work()
{
sum1[]=;//初始值
tot1=;
for(R i=;i<=n;i++)//计算A(n,n),即n!
{
k=i;
add1();
}
k=n;
add1();
k=n+;//分开乘,不然k太大会爆
add1();
k=n+;
for(R i=;i<=m;i++)//计算A(n+3,m)
{
add1();
--k;
}
//一二部分分割线~~~~~~~~~~~~~~~
sum2[]=*(n+);//不会破万,所以直接放在第一个即可
tot2=;
k=m;
add2();
for(R i=;i<=n;i++)
{
k=i;
add2();
}
k=n+;
for(R i=;i<=m-;i++)
{
add2();
--k;
}
ADD();//最后把sum1和sum2相加得到ans
printf("%d",ans[tot--]);
for(R i=tot;i>=;i--)printf("%04d",ans[i]);
/*printf("\n");
while(!sum1[tot1])tot1--;
printf("%d",sum1[tot1]);
for(R i=tot1-1;i>=1;i--)printf("%04d",sum1[i]);*/
} int main()
{
freopen("in.in","r",stdin);
scanf("%d%d",&n,&m);
work();
fclose(stdin);
return ;
}
[HNOI2012]排队 组合数的更多相关文章
- 【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] ...
- 2729:[HNOI2012]排队 - BZOJ
题目描述 Description某中学有n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人 ...
- [HNOI2012]排队
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输 ...
- BZOJ2729:[HNOI2012]排队(组合数学)
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- P3223 [HNOI2012]排队
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输 ...
- 洛谷 P3223 [HNOI2012]排队
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输 ...
- Luogu P3223 [HNOI2012]排队 组合
本来做了一道 P4901 排队 后来发现自己做错题了...到也都是数学qwq 这题最恶心的就是两只(雾)老师. 那我们分类讨论: 1.两个老师之间是男生: $ A(n,n)*A(n+1,2)*A(n ...
随机推荐
- LiteOS创建任务的一个BUG
在任务创建的时候,参数无法传递,第二个参数本来是用来做参数传递的,但是却没用到,很尴尬啊,缺少了这个功能,很多无法写了? osThreadId_t osThreadNew (osThreadFunc_ ...
- vim分屏功能总结
vim的分屏功能 总结起来,基本都是ctrl+w然后加上某一个按键字母,触发一个功能.(1)在shell里打开几个文件并且分屏: vim -On file1 file2 ... vim -on fil ...
- 分享一个 UiPath Studio 相关的公众号
RPA 和 UiPath 方面的资料比较少,因此我们自己创建了一个公众号,专门用于传播 UiPath 相关的知识. 会定期发布 UiPath 学习相关的信息.是目前难得的 UiPath 中文资源. 公 ...
- python学习笔记04 --------------基本运算符
1.算数运算 + 加 - 减 * 乘 / 除 % 取模(先做除法,然后返回余数) ** 乘方(幂运算) // 取整(相除,然后返回商的整数部分) 2.比较运算(返回布尔值) == ...
- [JSON].typeOf( keyPath )
语法:[JSON].typeOf( keyPath ) 返回:[String | Number | Boolean | Json | Array | Function | 空字符] 说明:获取指定键 ...
- leetcode-二叉树的层次遍历(Java)
给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层 ...
- 反片语 (Ananagrams,UVa 156)
题目描述: #include <iostream> #include <string> #include <cctype> #include <vector& ...
- 学习笔记,99乘法表,嵌套while循环
line = 0 #定义外循环初变量 while line < 9: #外循环判断语句 line += 1 #改变外循环初变量,避免陷入死循环 row = 0 #定义内循环初变量 while r ...
- JSP页面无法使用EL导致"java.sql.SQLException: No suitable driver found for ${snapshot}"的问题
使用JSTL来连接mysql,这个问题折腾了半天,老以为是Mysql驱动的问题,还好最后偶然发现了是EL表达式识别不了,报错: javax.servlet.ServletException: java ...
- [C++ map & dp]codeforces 960F. Pathwalks
题目传送门:960F 思路: 题目给人的感觉很像最长上升子序列,自然而然想到用dp的思路去处理 题目中给的限制条件是,要接上前面的边,前面的边权一定要小于当前的边权(题目按照输入的顺序,因此只找前面的 ...