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
 
 

码题5分钟,推导两小时

对于“不能相邻”,考虑采用插空法

首先对于无限制的男生有$A_n^n$种排列

这时产生了n+1个空档,插入2个老师还要$*A_{n+1}^2$

现在有n+3个空档,放m个女生有$A_{n+3}^m$种

此时的所有情况都满足条件

但只考虑了男生隔开老师的情况

而女生也可以隔开老师

考虑捆绑play(雾)法

让两个老师一个女生卡在一起(卢老爷我错辽)

这种组合放入男生队伍中有$n+1$种位置

选着一个女生有m种

放剩下的$A_{n+2}^{m-1}$

老师排列方式$A_2^2=2$

男生排列方式$A_n^n$

$ANS=A_n^n*A_{n+1}^2*A_{n+3}^m+(n+1)*2*A_n^n*m*A_{n+2}^{m-1}$

连高精乘低精都不会打了真是耻辱

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int n,m,num1[N],num2[N],tot[N];
/*int intlen(int x)
{
return (int)log10(x)+1;
}
void turn(int x,int num[])
{
int l=0;
while(x)
{
int now=x%10;
num[++l]=now;
x/=10;
}
num[0]=l;
//reverse(num+1,num+l+1);
}*/
void mult(int x,int num[])
{
int k=;
for(int i=;i<=num[];i++)
{
int tmp=num[i]*x+k;
num[i]=tmp%;
k=tmp/;
}
while(k)num[++num[]]=k%,k/=;
}
void sum(int a1[],int a2[],int res[])
{
int j=,x=;
while(j<=a1[]||j<=a2[])
{
res[j]=a1[j]+a2[j]+x;
x=res[j]/;
res[j]%=;
j++;
}
res[j]=x;
if(!res[j])j--;
res[]=j;
}
void print(int a[])
{
for(int i=a[];i;i--)printf("%d",a[i]);
puts(" ");
}
int main()
{
scanf("%d%d",&n,&m);
//turn(n,num1);turn(m,num2);
num1[]=num1[]=;
for(int i=;i<=n;i++)mult(i,num1);
for(int i=n+;i>=n;i--)mult(i,num1);
for(int i=n+;i>=n-m+;i--)mult(i,num1);
num2[]=num2[]=;
mult(n+,num2);
mult(m,num2);
mult(,num2);
for(int i=n+;i>=n+-(m-)+;i--)mult(i,num2);
for(int i=;i<=n;i++)mult(i,num2);
//print(num1);print(num2);
sum(num1,num2,tot);
print(tot);
return ;
}

[bzoj2729][HNOI2012]排队 题解 (排列组合 高精)的更多相关文章

  1. BZOJ2729 [HNOI2012]排队 【高精 + 组合数学】

    题目链接 BZOJ2729 题解 高考数学题... 我们先把老师看做男生,女生插空站 如果两个老师相邻,我们把他们看做一个男生,女生插空站 对于\(n\)个男生\(m\)个女生的方案数: \[n!m! ...

  2. [BZOJ2729]:[HNOI2012]排队(组合数学)

    题目传送门 题目描述 某中学有n名男同学,m名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) ...

  3. Luogu P2624 [HNOI2008]明明的烦恼 Prufer+组合+高精

    好的我把标准版过了... 设$ r_i$为$i$的度数 首先,我们设 $ sum = \Sigma r_i-1$,$ tot $ 为所有能够确定度数的点 所以我们有 $ C ^ {sum} _{n-2 ...

  4. BZOJ2729 HNOI2012排队(组合数学+高精度)

    组合入门题.高精度入门题. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...

  5. BZOJ2729:[HNOI2012]排队(组合数学)

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  6. bzoj2729 [HNOI2012]排队

    组合数学,推一下式子,并不难推. java代码 import java.io.*; import java.math.BigInteger; import java.util.*; public cl ...

  7. luoguP1080 国王游戏 题解(NOIP2012)(贪心+高精)

    luoguP1080 国王游戏 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

  8. [题解](排列组合)luogu_P3223排队

    把老师和女生插到男生中间,先对男生排列:A(n,n),然后把老师插到n+1个空里:A(n+1,2),然后放入女生:A(n+3,m) 但是少考虑了老师之间由1个女生分开的情况,所以把三个人看作一个整体, ...

  9. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)

    题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...

随机推荐

  1. jmeter之-非GUI模式&登录实战

    1.执行测试脚本 jmeter -n -t JMeter分布式测试示例.jmx 2.指定结果文件及日志路径 jmeter -n -t JMeter分布式测试示例.jmx -l report\01-re ...

  2. (55)C# windows 消息

    窗体捕获消息 namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeC ...

  3. Nodejs-交互式版本管理

    n - npm:Interactively Manage Your Node.js Versions

  4. JWT工具类

    package com.ynhrm.common.utils; import io.jsonwebtoken.Claims;import io.jsonwebtoken.JwtBuilder;impo ...

  5. Optparse 简介

    optparse 这个库的主要作用是可以用为脚本提供传递命令参数功能 一个简单的例子 def main(): parser = OptionParser(usage = "usage: %p ...

  6. Optional int parameter 'pId' is present but cannot be translated into a null value due to being declared as a primitive type.

    接口测试的时候遇到了一个问题,导致测试阻断了好久,在此记录,谨防忘记. 具体报错如下: Optional int parameter 'pId' is present but cannot be tr ...

  7. im开发总结:netty的使用

    最近公司在做一个im群聊的开发,技术使用得非常多,各种代码封装得也是十分优美,使用到了netty,zookeeper,redis,线程池·,mongdb,lua,等系列的技术 netty是对nio的一 ...

  8. XStream的简单使用

    XStream XStream是一个java对象和xml相互转换的工具 创建XStream对象:XStream stream = new XStream() Java对象转换成xml:stream . ...

  9. guake No D-BUS daemon running

    Win 键 搜索  Startup Application  添加 启动脚本 eval `dbus-launch --auto-syntax` 在其之后添加 guake & 开机启动 .

  10. 【LeetCode】贪心

    [452] Minimum Number of Arrows to Burst Balloons [Medium] 给一堆线段,使用最少的arrow,穿过所有的线段.陈题,第一条线段的终点. Inpu ...