zoukankan      html  css  js  c++  java
  • 【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;
    }
        
    
    
  • 相关阅读:
    POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】
    HDU 5687 Problem C 【字典树删除】
    HDU 1298 T9【字典树增加||查询】
    AIM Tech Round 5 (rated, Div. 1 + Div. 2) C. Rectangles 【矩阵交集】
    基本数据结构:栈-队列-双向队列
    Elasticsearch 环境准备
    django项目部署
    linux基础
    购物车
    Python内置函数
  • 原文地址:https://www.cnblogs.com/cjyyb/p/7617354.html
Copyright © 2011-2022 走看看