import java.util.Scanner;
public class POJ_1095 {
public static final int SIZE = 20;
static int a[] = new int[21],sum[] = new int[21];
public static void main(String[] args) {
a[0] = 1;a[1] = 1;sum[0] = 0;sum[1] = 1;
for(int i=2;i<=SIZE;i++){
for(int j=0;j<i;j++)
a[i] += a[j]*a[i-j-1]; // 递推求出 i个结点 组成多少种不同的二叉树
}
for(int i=2;i<=SIZE;i++) // 前n个结点 共组成多少种不同的二叉树
sum[i] += sum[i-1]+a[i];
Scanner scan = new Scanner(System.in);
while(true){
int n = scan.nextInt();
if(n == 0)
break;
solve(n);
System.out.println();
}
}
public static void solve(int n) {
if(n == 0)
return ;
if(n == 1){
System.out.print("X");
return ;
}
int i,j;
for(i=0;i<=SIZE;i++)
if(sum[i]>=n)
break;
n -= sum[i-1];
for(j=0;j<i;j++){
int t = a[j]*a[i-j-1];
if(t<n)
n -= t;
else
break;
}
if(j!=0){
System.out.print("(");
solve(sum[j-1]+(n-1)/a[i-j-1]+1); // 左子树 是第几种情况
System.out.print(")");
}
System.out.print("X");
if(j!=i-1){
System.out.print("(");
solve(sum[i-j-2]+(n-1)%a[i-j-1]+1); //右子树是第几种情况
System.out.print(")");
}
}
}
poj 1095
最新推荐文章于 2015-08-21 08:37:24 发布