zoukankan      html  css  js  c++  java
  • 题解 P4609 【[FJOI2016]建筑师】


    一道有趣的组合数学题

    这道题其实挺水的至少没有黑题难度(滑稽 只要学过点组合数学就没太大问题。不过思路还是比较巧妙,值得一做。

    讲思路吧。

    题意如图:(建筑编号从左到右依次排列)

    解释一下,画红框的是表示这个红框内的建筑都由一个最高建筑“代表”。比如从左看,111号建筑挡住了2,32,32,3号建筑,直到444号建筑比111号高,444号建筑再成为下一群建筑的代表。

    那么给定从最左边看能看到AAA个建筑,从最右边看能看到BBB个建筑,如何求方案数呢?

    接下来就是本题的核心了。

    我们会发现,当一群数量为kkk的建筑的“代表”确定后,除去代表的剩下k−1k-1k1 个建筑就可以随意排列,那么就有(k−1)!(k-1)!(k1)! 种方案,那么就等价于这kkk个建筑的圆排列。除去整个序列中最高的那个建筑,左边看有A−1A-1A1 群建筑,右边看有B−1B-1B1 群建筑。总共有A+B−2A+B-2A+B2 群建筑,那么也就有A+B−2A+B-2A+B2 个圆排列。 然后。。。有没有想到第一类斯特林数!在这题中就是nnn 个人,A+B−2A+B-2A+B2 张桌子。然后你再想,在总共A+B−2A+B-2A+B2 群建筑中选A−1A-1A1 群放到最高建筑的左边,不就有CA+B−2A−1C_{A+B-2}^{A-1}CA+B2A1 种方案吗!所以总方案是CA+B−2A−1∗Sn−1A+B−2C_{A+B-2}^{A-1}*S_{n-1}^{A+B-2}CA+B2A1​∗Sn−1A+B−2​

    优秀的O(1)O(1)O(1)询问。

    CCC和SSS预处理一下就珂以辣!

    你问我什么是斯特林数?出门转百度or组合数学其实是我懒得写了


    上代码:

    #include<bits/stdc++.h>
    #define mod 1000000007
    using namespace std;
    int T,n,a,b;
    long long s[50002][202],c[102][202];//要开long long别问我怎么知道的
    inline int rd(){//辣鸡快读,大佬勿喷
        int ans=0,flag=1;
        char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        if(ch=='-')flag=-1,ch=getchar();
        while(ch>='0'&&ch<='9')ans=ans*10+ch-48,ch=getchar();
        return ans*flag;
    }
    int main(){
        T=rd();
        for(register int i=0;i<=200;i++){
            c[i][0]=1;
        }
        for(register int i=1;i<=200;i++){
            for(register int j=1;j<=i;j++){
                c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;//记得取模
            }
        }
        memset(s,0,sizeof(s));
        s[0][0]=1;
        for(register int i=1;i<=5e4;i++){
            for(register int j=1;j<=200;j++){
                s[i][j]=(s[i-1][j-1]%mod+s[i-1][j]*(i-1)%mod)%mod;
            }
        }
        while(T--){
            n=rd(),a=rd(),b=rd();
            printf("%lld
    ",(c[a+b-2][a-1]*s[n-1][a+b-2])%mod);
        }
        return 0;
    }
    

    切黑题,啦啦啦

  • 相关阅读:
    质数
    解决Winform中ListView.TopItem设置的问题
    证书格式简介及不同格式之间的转换方式
    Postgresql如何清理pg_xlog
    VirtualBox 4.2 released !
    ImportError: No module named qtdemo_rc
    C#使用RSA证书文件加密和解密示例
    VIM自动关闭预览提示窗口
    VMware和VirtualBox中的网络适配器类型及虚拟网络性能优化
    正则表达式Java
  • 原文地址:https://www.cnblogs.com/Zenyz/p/9794582.html
Copyright © 2011-2022 走看看