【HNOI2012】排队

做题状态很迷啊。

题面

https://www.luogu.org/problem/P3223

题解

本来想的是$$ans=A_{n}^{n} A_{n+1}^{m} A_{n+m+1}^{2}$$,先男生、后女生、最后老师,后来发现假了,因为可以两个女生一开始相邻,但是后来老师插进去把他们分离了。

换一种考虑顺序:先男生、后老师、最后女生,分两种情况讨论:

  1. 老师和老师间有男生(按上面的方法算即可)
  2. 老师和老师间只有一个女生(先把两个老师看做一个点,考虑女生时再把两个老师和插进去的女生看做一个点,再按上面方法算即可)

$$ans=A_{n}^{n} A_{n+1}^{2} A_{n+3}^{m} + 2 A_{n}^{n} A_{n+1}^{1} A_{m}^{1} A_{n+2}^{m-1}$$

#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define N 12000
#define ri register int

using namespace std;

int a[N+1],b[N+1];

void mul(int x) {
  for (ri i=0;i<N;i++) a[i]*=x;
  for (ri i=0;i<N;i++) a[i+1]+=a[i]/10,a[i]%=10;
}
void mul2(int x) {
  for (ri i=0;i<N;i++) b[i]*=x;
  for (ri i=0;i<N;i++) b[i+1]+=b[i]/10,b[i]%=10;
}

int main() {
  int n,m;
  scanf("%d %d",&n,&m);
  if (m>n+3 || 2>n+m+1) {
    printf("0");
    return 0;
  }
  a[0]=1;
  for (ri i=1;i<=n;i++) mul(i);
  for (ri i=n+1;i>=n;i--) mul(i);
  for (ri i=n+3;i>=(n+3)-m+1;i--) mul(i);
  b[0]=1;
  for (ri i=1;i<=n;i++) mul2(i); mul2(n+1); mul2(2); mul2(m);
  for (ri i=n+2;i>=(n+2)-(m-1)+1;i--) mul2(i);

  for (ri i=0;i<N;i++) a[i]+=b[i],a[i+1]+=a[i]/10,a[i]%=10;
  int fl=0;
  for (ri i=N-1;i>=0;i--) {
    if (a[i]) fl=1;
    if (fl) printf("%d",a[i]);
  }
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/shxnb666/p/11437759.html