题解

27 条题解

  • 0
    @ 2021-10-14 01:28:21

    递归即可,比如说4个节点的树。除去根节点,剩下三个节点。
    按顺序排的话,就是03 12 21 30 (就是先是左子树是0个节点 拼接 右子树是3个节点, 然后是左子树是1个节点 拼接 右子树是2个节点...)
    假设X个节点的树,有A种情况,假设Y个节点的树,有B种情况。
    那么 XY (就是左子树是X个节点,右子树是Y个节点)有 A x B 种情况。

    #include <stdlib.h>
    #include <stdio.h>
    
    #define MAX_NODE 18
    int tCount[MAX_NODE]; // 固定节点的个数
    int nodeId[MAX_NODE]; //序号(节点最大)
    
    void buildTc() {
        tCount[0] = tCount[1] = 1;
        nodeId[0] = 0;
        nodeId[1] = 1;
        for(int i=2;i<MAX_NODE;i++) {
            int subC = i-1;
            int sum = 0;
            for(int j=0;j<=subC;j++) {
                sum += tCount[j] * tCount[subC - j];
            }
            tCount[i] = sum;
            nodeId[i] = nodeId[i-1] + tCount[i];
    //      printf("%d = %d\n", i, tCount[i]);
        }
    }
    int printNode(int n) {
        int nodeLevel = 0;
        for(int i=MAX_NODE-1;i>=0;i--) {
            if(n > nodeId[i]) {
                nodeLevel = i+1;
                break;
            }
        }
        int subC = nodeLevel-1;
        int nId = nodeId[subC];
        for(int j=0;j<=subC;j++) {
            int nl = nId + tCount[j] * tCount[subC-j];
            if(nl < n) {
                nId = nl;
            } else {
                // 左节点j, 右节点subC-j
                int leftCount = n - nId;
                //左边排第几
                int lIdx = leftCount / tCount[subC-j];
                int rIdx = leftCount % tCount[subC-j];
                int lRealIdx = j == 0 ? 0 : nodeId[j-1]+(rIdx != 0 ? 1 : 0) + lIdx;
                if(lRealIdx != 0) {
                    putchar('(');
                    printNode(lRealIdx);
                    putchar(')');
                }
                putchar('X');
                //右边排第几
    
                int rRealIdx = subC-j ==0 ? 0 : nodeId[subC-j-1] + (rIdx > 0 ? rIdx : tCount[subC-j]);
                if(rRealIdx != 0) {
                    putchar('(');
                    printNode(rRealIdx);
                    putchar(')');
                }
                break;
            }
        }
    }
    int main() {
        buildTc();
        int n;
        char isFirst = 1;
        do {
            scanf("%d", &n);
            if(n == 0) break;
            if(isFirst) isFirst = 0; else putchar('\n');
            printNode(n);
        } while(1);
        return 0;
    }
    
    
  • 0
    @ 2015-05-29 11:05:23

    我不会做,让小朋友cpc被xxx吧

  • 0
    @ 2009-02-20 18:33:50

    递归不是我强项

  • 0
    @ 2008-11-08 11:15:10

    数学题。先找规律,再利用catalan数求解。我的程序有点慢。

    Accepted 有效得分:100 有效耗时:418ms

  • 0
    @ 2008-10-31 20:31:34

    ORZ啊oRZ- -

  • 0
    @ 2008-10-31 20:25:50

    莫非又要用高精了...ORZ...

  • 0
    @ 2008-10-15 19:56:50

    和卡特兰数列有关系的

    挺烦人的,特别是细节.

  • 0
    @ 2008-10-08 19:47:36

    告诉大家一个秘密,CPC是一个IOI预备选手。。。

    • @ 2021-08-08 10:56:53

      告诉大家一个秘密,随便说CPC会zzmg。。。

  • 0
    @ 2008-09-30 11:24:03

    构造。

  • 0
    @ 2008-09-25 20:23:43

    我写了55行T.T

    膜拜楼下40行

  • 0
    @ 2008-08-21 15:42:20

    sd ][

  • 0
    @ 2008-08-21 04:24:22

    POJ1095

  • 0
    @ 2008-08-10 13:18:38

    郁闷啊~~忘了换行……T_T

  • 0
    @ 2008-08-07 23:33:14

    离地心都三四里了 - -

  • 0
    @ 2008-08-07 10:49:20

    我好激动!!(- -|||)

    找规律跟catalan差不多 预处理的时候竟然计数计错了!!!啊啊啊 查了半天

  • 0
    @ 2008-08-03 22:00:03

    是那种传说中的解码么。。

  • 0
    @ 2008-08-01 14:35:57

    ZJU1062

  • 0
    @ 2008-07-28 18:44:26

    不是有10个吗?

  • 0
    @ 2008-07-27 11:13:28

    请问,CPC为什么要逃离

  • 0
    @ 2008-07-26 21:08:15

    cpc...

    这提明明考递归,怎么变成数论了??

信息

ID
1400
难度
3
分类
组合数学 | Catalan数列 点击显示
标签
(无)
递交数
192
已通过
100
通过率
52%
被复制
2
上传者