• 【BZOJ2729】【HNOI2012】排队(组合数学)


    不想弄题面了。。。

    题解

    做这道题目我真的好蠢。。。
    好容易的数学题目
    很明显自己写高精度吧。。。(不解释了)
    被dalaoD了,底下的题解可能是假的。看代码里的注释把QaQ
    /*
    剩下的如何计算。
    要有两类情况
    ①老师之间有男生
    那么,这种情况下,直接插空就行了
    先把M个女生插进去A(m,n+1)
    再把2个老师插进去A(2,n+m+1)
    ②老师之间只有一个女生
    先选出一个女生,放在老师之间A(1,m)
    再把剩下的女生插进男生中A(m-1,n+1)
    最后把老师和女生看成整体放进去A(1,m+n)
    因为老师之间位置可以互换,还有乘2
    */
    最后两类直接相加即可

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    inline int read()
    {
        register int x=0,t=1;
        register char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        if(ch=='-'){t=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
        return x*t;
    }
    struct BigInt
    {
        int s[1000000];
        int ws;
        void Prepare()
            {
                s[1]=1;
                ws=1;
            }
        void Multi(int x)
            {
                for(int i=1;i<=ws;++i)s[i]*=x;
                for(int i=1;i<=ws;++i)s[i+1]+=s[i]/10,s[i]%=10;
                while(s[ws+1])ws+=1,s[ws+1]+=s[ws]/10,s[ws]%=10;
            }
        void write()
            {
                for(int i=ws;i;--i)printf("%d",s[i]);
                printf("
    ");
            }
    }Ans1,Ans2;
    int main()
    {
        int N=read(),M=read();
        //第一种情况,老师之间插男生
        Ans1.Prepare();
        for(int i=2;i<=N;++i)Ans1.Multi(i);
        Ans1.Multi(N+1);Ans1.Multi(N);
        for(int i=1;i<=M;++i)Ans1.Multi(N+4-i);
        //第二种情况,老师之间插女生
        //首先选出一个女生放在老师之间
        Ans2.Prepare();
        Ans2.Multi(M);
        Ans2.Multi(2);
        //作为一个整体丢在男生之间
        for(int i=1;i<=N;++i)Ans2.Multi(i+1);
        //再把女生放进来
        for(int i=1;i<M;++i)Ans2.Multi(N+3-i);
        if(Ans1.ws<Ans2.ws)swap(Ans1,Ans2);
        for(int i=1;i<=Ans2.ws;++i)Ans1.s[i]+=Ans2.s[i];
        for(int i=1;i<=Ans1.ws;++i)Ans1.s[i+1]+=Ans1.s[i]/10,Ans1.s[i]%=10;
        while(Ans1.s[Ans1.ws+1])Ans1.ws++,Ans1.s[Ans1.ws+1]+=Ans1.s[Ans1.ws]/10,Ans1.s[Ans1.ws]%=10;
        Ans1.write();
        return 0;
    }
        
    
    
  • 相关阅读:
    Hsl PLC
    .NET平台常用框架整理
    SSH全注解实例详解
    word2vec (CBOW、分层softmax、负采样)
    pandas dataframe 一行变多行 (query pv统计term pv)
    python 按二维数组的某行或列排序 (numpy lexsort)
    基于决策树的分类算法
    【linux】 mail/mutt 发送邮件
    【python】含中文字符串截断
    【python】 判断纯ascii串
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7617354.html
Copyright © 2020-2023  润新知