[codevs3862]竞赛班的垃圾处理

题目描述 Description

竞赛班的师弟们都很懒,每个人都不喜欢倒垃圾,结果垃圾就会跟师兄的RP一样越堆越多,当然,老师时不时就会叫他们去倒垃圾。由于他们真的很懒,他们只会直接将垃圾桶最上面袋拿去扔。师弟们扔垃圾的时候,会先把垃圾装成袋,然后将垃圾编号,第一袋扔到垃圾桶的垃圾编为①号……掏垃圾的阿伯会清点一下编号的顺序,然后反馈给老师,让老师知道竞赛班高一师弟到底有多懒……【比如:当师弟们扔了3袋垃圾时,得到的编号有可能是123(每一袋扔进垃圾桶时他们就拿去扔,这个编号说明还是有人挺勤劳的),132(第一袋拿出去扔,然后垃圾桶里多扔了第2,3袋之后,他们再从上往下一袋一袋拿去扔)……】而竞赛班某师弟对阿伯倾慕已久,想知道阿伯最后收到的垃圾的顺序有多少种可能,由于他不好好学习科学文化知识,智商有点捉鸡,于是想让你帮他算出来,但你又觉得亲身实践简直蠢到爆,于是,你决定让计算机去做这件事。

如果1s内计算机算不出,那少年,倒垃圾去吧,你太懒了……

输入描述 Input Description

只有一个整数n,表示师弟们总共扔了多少袋垃圾。

输出描述 Output Description

只有一个整数m,表示阿伯掏出垃圾的顺序的总可能结果。

样例输入 Sample Input

3

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

时间限制

每个测试点1s

数据范围

对于50%的数据,1≤n≤15

对于100%的数据,1≤n≤35

Hint

垃圾要按时倒啊,没听说过倒垃圾的男人最性感吗?【哪听来的这句话= =】……

    35袋垃圾……姚老叫你们不要在机房吃东西听到没有

Problem by Tangenty

思路

  卡特兰数最基本的操作,不知道的同学自行脑补度娘,这里在奉送上几个求解的方式。

令 h(0)=1,h(1)=1,h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
h(n)=h(n-1)*(4*n-2)/(n+1);(n<=34)
h(n)=C(2n,n)/(n+1) (n=1,2,3,...)
h(n)=c(2n,n)-c(2n,n+1)(n=1,2,3,...)
View Code

题目代码

var h:array[-100..100] of int64;
    j,n,k:int64;i:longint;
begin
    fillchar(h,sizeof(h),0);
    h[0]:=1;
    h[1]:=1;
    readln(n);
    if (n=1) or (n=0) then
        begin
            writeln(h[n]);
            halt;
        end;
    for i:=2 to n do
        begin
            j:=i-1;
            k:=0;
            while k<>i do
                begin
                    h[i]:=h[i]+h[k]*h[j];
                    dec(j);
                    inc(k);
                end;
        end;
    writeln(h[n]);
end.
原文地址:https://www.cnblogs.com/yangqingli/p/4740653.html