//356K 0MS G++
#include <cstdio>
#include <cstring>
using namespace std;
int CATALAN[19]={1,1,2,5,
14,42,132,429,
1430,4862,16796,
58786,208012,742900,2674440,
9694845,35357670,129644790,477638700};
int nodeNum;
int N;
void printTree(int nodeNum, int sequence) { // sequence start from 1
// printf("BB %d %d\n", nodeNum, sequence);
int sum = 0;
if (nodeNum == 1) {
printf("X");
return;
}
int i = 0;
for (; sum < sequence; i++) {
sum += CATALAN[i]*CATALAN[nodeNum - i -1]; // because of root node, -1
}
int leftTreeNodeNum = i - 1;
int rightTreeNodeNum = nodeNum - leftTreeNodeNum -1;
// printf("leftTreeNodeNum %d rightTreeNodeNum %d\n", leftTreeNodeNum, rightTreeNodeNum);
sum -= CATALAN[i-1]*CATALAN[nodeNum - (i-1) -1];
sequence -= sum;
if (leftTreeNodeNum) {
printf("(");
printTree(leftTreeNodeNum, (sequence-1)/CATALAN[rightTreeNodeNum] + 1);
printf(")");
}
printf("X");
if (rightTreeNodeNum) {
printf("(");
printTree(rightTreeNodeNum, (sequence-1)%CATALAN[rightTreeNodeNum] + 1);
printf(")");
}
}
int main() {
while(scanf("%d", &N) != EOF) {
if (N == 0) {
return 0;
}
int sum = 0;
int i = 1;
// int k = 0;
// int j = 0;
// for (; j <= 10; k++) {
// j++;
// }
// printf("k %d j %d\n", k, j);
for (; sum < N; i++) {
sum += CATALAN[i];
// printf("A %d %d %d\n", i, sum, N);
}
// printf("i %d\n", i);
nodeNum = i - 1; // CATALAN[0] is also considered
// printf("nodeNum %d\n", nodeNum);
printTree(nodeNum, N - (sum - CATALAN[nodeNum]));
printf("\n");
}
}
http://blog.csdn.net/lvlu911/article/details/5425974