poj 1095 Trees Made to Order
http://poj.org/problem?id=1095
先求出n个节点数的二叉树的形态有多少种。卡特兰数f[n]=f[n-1]*(4*n-2)/(n+1);再递归求。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll long long 5 #define maxn 200 6 using namespace std; 7 8 ll f[maxn]; 9 int n,m; 10 11 void inti() 12 { 13 f[0]=1; 14 for(int i=1; i<23; i++) 15 { 16 f[i]=f[i-1]*(4*i-2)/(i+1); 17 } 18 } 19 20 void deal(int n,int k) 21 { 22 int i,sum=0; 23 if(n==1) {printf("X"); return ;} 24 for(i=0; sum+f[i]*f[n-1-i]<k; i++) 25 { 26 sum+=(f[i]*f[n-1-i]); 27 } 28 k-=sum; 29 if(i) 30 { 31 printf("("); 32 deal(i,(k-1)/f[n-1-i]+1); 33 printf(")"); 34 } 35 printf("X"); 36 if(i!=n-1) 37 { 38 printf("("); 39 deal(n-1-i,(k-1)%f[n-1-i]+1); 40 printf(")"); 41 } 42 43 } 44 45 int main() 46 { 47 inti(); 48 while(scanf("%d",&n)!=EOF) 49 { 50 if(n==0) break; 51 for(int i=1; ; i++) 52 { 53 if(n>f[i]) 54 { 55 n-=f[i]; 56 } 57 else{ 58 m=i; 59 break; 60 } 61 } 62 deal(m,n); 63 printf("\n"); 64 } 65 return 0; 66 }