• Luogu P3223 [HNOI2012]排队 组合


    本来做了一道  P4901 排队 后来发现自己做错题了。。。到也都是数学qwq


    这题最恶心的就是两只(雾)老师。

    那我们分类讨论:

    1.两个老师之间是男生:

      $ A(n,n)*A(n+1,2)*A(n+3,m) $

    首先男生有$ A(n,n)=n! $种排列方式;然后有$ n+1$ 个空隙(加上开头和结尾)可以放老师,所以老师是$ A(n+1,2)=(n+1)!/(n+1-2)!=(n+1)*n$;然后有$ n+3$ 个空隙(加上开头和结尾)可以放女生,所以女生是$ A(n+3,m)=frac{(n+3)!}{(n+3-m)!}$

    2.两个老师之间是女生(相当于捆绑):
      $A(n,n)*A(2,2)*m*A(n+1,1)*A(n+2,m-1)$

    首先男生有$ A(n,n)=n! $种排列方式;老师按先后分有$A(2,2)=2$种排列;然后女生中任取$1$个有$m$种;然后有$ n+1$ 个空隙(加上开头和结尾)可以放 老师+女生+老师(捆绑),所以 老师+女生+老师一个整体的位置 是$ A(n+1,1)=(n+1)!$;然后有$ n+2$ 个空隙(加上开头和结尾,并且 老师+女生+老师 看作一个整体)可以放$m-1$女生,所以女生是$ A(n+2,m-1)=frac{(n+2)!}{(n+3-m)!}$

    所以原式:$A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*A(2,2)*m*A(n+1,1)*A(n+2,m-1)$

    化简可得:$frac{(n+1)!*(n+2)*(n^2+3*n+2*m)}{(n+3-m)!}$

    然后自己死在了scanf上:少写了一个%d...fk

    #include<cstdio>
    #include<iostream>
    #define R register int
    using namespace std;
    const long long B=10000000000ll;
    int n,m,sz=1;
    long long ans[10000];
    inline void mul(int x) { R tmp=0;
        for(R i=1;i<=sz;++i) ans[i]*=x,ans[i]+=tmp,tmp=ans[i]/B,ans[i]%=B;
        if(tmp) ++sz,ans[sz]=tmp;
    }
    signed main() { 
        scanf("%d%d",&n,&m); ans[1]=1; 
        for(R i=1;i<=n+1;++i) mul(i); mul(n*(n+3)+2*m);
        for(R i=n-m+4;i<=n+2;++i) mul(i); //cout<<sz<<endl;
        printf("%lld",ans[sz]); for(R i=sz-1;i;--i) printf("%010lld",ans[i]); putchar('
    ');
    } 

    2019.05.17

  • 相关阅读:
    salt执行报错一例
    state配置语言实战
    salt-ssh使用
    八、job管理
    六、saltstack的module组件
    五、Pillar数据管理中心
    Web Server与App Server
    二分查找的时间复杂度(TODO )
    二分查找的时间复杂度(TODO )
    git : error setting certificate verify locations
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10879025.html
Copyright © 2020-2023  润新知