zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    EF6的多线程与分库架构设计实现
    Windows环境下安装Ionic
    Win7 下安装RabbitMQ
    在VS Nuget命令行下进行EF数据库迁移
    WebSocket与Tcp连接
    常用浏览器内核
    异步代码
    TCP与UDP的区别
    二分查找(折半查找)
    顺序查找
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11437759.html
Copyright © 2011-2022 走看看