2018年长沙理工大学第十三届程序设计竞赛 J 杯子(卡特兰数)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37025443/article/details/79959350

点击打开链接


解析:

这里其实就是一个出栈入栈的顺序,问你第m个入栈后,使得栈里面球得个数位k

卡特兰数详解点击打开链接,关键是要理解用二进制数来解释栈的出入顺序由卡特兰数表示的分析、

我们把'1'当作入栈,'0'当作出栈

这样其实就转换成从第m个1放入后,

前面有(不包括第m个1,因为它位置是固定的)m-1个1,m-k个0,让你随意排列有多少种合法的情况
这里注意因为题目里说了在第m个求放入之后,立马有k个球,所以第m个1的位置其实是固定的,一定是在第2m-k的位置上

这样就变成了普通的卡特兰数的情况了:(总的情况-非法的情况(某一刻0的之前累计数>1的累计数,即栈里没元素还继续弹出))
必有奇数2w+1位时,前面有w个1,w+1个0,那么我们将这一位后面的所有位的0,1互换,则

1: m-1个(总)      w个(前2w+1位)      m-1-w个(后2m-k-1-2w-1位)    ->m-k-1(变换之后)
0: m-k个(总)  w+1个(前2w+1位)   m-k-w-1个(后2m-k-1-2w-1位)       ->m(变换之后)
所以非法的情况就是C(2m-k-1,m)
则前一部分的情况是p1=C(2m-k-1,m-1)-C(2m-k-1,m)

同理后一部分(注意因为这里在一开始的时候,栈里面已经有k位了,所以第一次出现非法的就是2w+k+1位)
1:     n-m个(总)          w个(前2w+k+1位)      n-m-w个(后2n-2w-1位)       ->n-m-1(变换之后)
0: n-m+k个(总)  w+k+1个(前2w+k+1位)   n-m-w-1个(后2n-2w-1位)  ->n-m+k+1(变换之后)
则后一部分的非法情况就是C(2n-2m+k,n-m-1)
后一部分的情况是p2=C(2n-2m+k,n-m)-C(2n-2m+k,n-m-1)
ans=p1*p2

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f3f3f3f3f
#define MOD 1000000007

typedef long long int lli;
const int MAXN = 2e6+20;
lli jc[MAXN];


lli pow(lli a,lli n,lli p)
{
    lli ans=1;
    while(n){
        if(n&1) ans=ans*a%p;
        n=n>>1;
        a=a*a%p;
    }
    return ans%p;
}

lli niYuan(lli a,lli b)
{
    return pow(a,b-2,b);
}

lli C(lli a,lli b)
{
    return jc[a]*niYuan(jc[b],MOD)%MOD*niYuan(jc[a-b],MOD)%MOD;
}

void caljc()
{
    lli p=1;
    jc[0]=1;
    for(int i=1;i<MAXN;i++)
    {
        p=(p*i)%MOD;
        jc[i]=p;
    }
}


int main()
{
    int t;
    caljc();
    scanf("%d",&t);
    while(t--)
    {
        lli n,m,k;
        scanf("%lld%lld%lld",&n,&m,&k);
        if(m>n||k>m)
        {
            printf("0\n");
            continue;
        }
        lli part1;
        if(m==k) part1=1;
        else part1=(C(2*m-k-1,m-1)-C(2*m-k-1,m)+MOD)%MOD;
        lli part2;
        if(m==n) part2=1;
        else part2=(C(2*n-2*m+k,n-m)-C(2*n-2*m+k,n-m-1)+MOD)%MOD;
        printf("%lld\n",part1*part2%MOD);

    }
    return 0;

}




阅读更多

没有更多推荐了,返回首页