zoukankan      html  css  js  c++  java
  • [FJOI2016]建筑师

    一道好♂玩的题。

    考虑怎么才能让这个序列满足条件。

    考虑到这个高度是个n的排列,然后我们可以发现n一定是左右都可见的,然后就可以认为左边的前缀max有A-1个值,右边的后缀max有B-1个值。

    可以认为成从n-1个数中取A+B-2个数组成一个圆排列,A-1个放左边。

    所以这样的话答案就是strling[n-1][A+B-2]*C[A+B-2][A-1]。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int mod=1e9+7;
    long long strling[50005][205],C[205][205];
    int main() {
        C[0][0]=1;
        for(int i=1;i<=200;i++) {
            C[i][0]=1;
            for(int j=1;j<=i;j++) {
                C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
            }
        }
        strling[0][0]=1;
        for(int i=1;i<=50000;i++) 
            for(int j=1;j<=200;j++) 
                strling[i][j]=(strling[i-1][j-1]+strling[i-1][j]*(i-1))%mod;
        unsigned int T;
        int n,A,B;
        cin>>T;
        while(T--) {
            scanf("%d%d%d",&n,&A,&B);
            printf("%d
    ",(strling[n-1][A+B-2]*C[A+B-2][A-1])%mod);
        }
        return 0;
    }
    [FJOI2016]建筑师
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    Spring Boot
    Spring Boot
    Spring Boot
    Restful API
    Jenkins
    虚拟化
    SpringBoot入门
    System Workbench for STM32(based on Eclipse)开发环境配置
    装机总结
    这年暑假
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9757558.html
Copyright © 2011-2022 走看看