[Luogu P3223] [BZOJ 2729] [HNOI2012]排队 |
您所在的位置:网站首页 › 33名学生和两名老师乘船的题 › [Luogu P3223] [BZOJ 2729] [HNOI2012]排队 |
洛谷传送门
BZOJ传送门
题目描述
某中学有 n n n 名男同学, m m m 名女同学和两名老师要排队参加体检。他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输出格式 输入格式:只有一行且为用空格隔开的两个非负整数 n n n 和 m m m,其含义如上所述。 对于 30%的数据 n ≤ 100 , m ≤ 100 n\le 100,m\le 100 n≤100,m≤100 对于 100%的数据 n ≤ 2000 , m ≤ 2000 n\le 2000,m\le 2000 n≤2000,m≤2000 输出格式:输出文件 output.txt 仅包含一个非负整数,表示不同的排法个数。注意答案可能很大。 输入输出样例 输入样例#1: 1 1 输出样例#1: 12 解题分析直接一起搞好像有点麻烦, 考虑先把男生放好,有 n ! n! n!种放的方法, 然后向里面插入老师, 显然有 ( n + 1 ) 2 ‾ (n+1)^{\underline{2}} (n+1)2种方案。然后再插入女生, 现在就有 m ! × ( n + 3 m ) m!\times \binom{n+3}{m} m!×(mn+3)种方案了。 但是这样并没有考虑女生夹在两个老师之间的情况, 因此我们可以直接把两个老师和一个女生打包算在一起, 这种打包的方式就有 2 × m 2\times m 2×m种。然后考虑插男生, 有 n + 1 n+1 n+1种方式。最后剩下的 m − 1 m-1 m−1个女生再插入队列, 有 ( m − 1 ) ! × ( n + 2 m − 1 ) (m-1)!\times \binom{n+2}{m-1} (m−1)!×(m−1n+2)种方法。 那么答案就是 n ! × ( ( ( n + 1 ) × n × m ! × ( n + 3 m ) ) + ( 2 × m × ( n + 1 ) × ( m − 1 ) ! × ( n + 2 m − 1 ) ) ) n!\times(((n+1)\times n\times m!\times\binom{n+3}{m})+(2\times m\times (n+1)\times (m-1)!\times \binom{n+2}{m-1})) n!×(((n+1)×n×m!×(mn+3))+(2×m×(n+1)×(m−1)!×(m−1n+2)))。 套一个高精板子就好了。 代码如下: #include #include #include #include #define R register #define IN inline using namespace std; namespace BigInteger { #define maxn 100005 struct Big_integer{ int d[maxn], len; void clean() { while(len > 1 && !d[len-1]) len--; } Big_integer() { memset(d, 0, sizeof(d)); len = 1; } Big_integer(int num) { *this = num; } Big_integer(char* num) { *this = num; } Big_integer operator = (const char* num){ memset(d, 0, sizeof(d)); len = strlen(num); for(int i = 0; i 9) c.d[i++]%=10, c.d[i]++; c.len = max(len, b.len); if (c.d[i] && c.len |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |