http://poj.org/problem?id=1095
先打个表 然后dfs一下
#include<iostream> #include<cstdio> #include<cstdlib> #include<ctime> #include<queue> #include<cstring> #include<set> #include<cmath> #include<algorithm> #define LL long long using namespace std; const int N=25; int a[N]; void begin() { a[0]=1; a[1]=1; for(int i=2;i<N;++i) { a[i]=0; for(int l=0;l<i;++l) { a[i]+=(a[l]*a[i-l-1]); } } } int I; void dfs(int k,int s) { if(k==1) { printf("X"); return ; } int l; int sum=0; for(l=0;l<k;++l) { sum+=a[l]*a[k-l-1]; if(sum>=s) { sum-=a[l]*a[k-l-1]; break; } } sum=s-sum; int w=sum/a[k-l-1]; if(sum%a[k-l-1]) ++w; if(l>0) { printf("("); dfs(l,w); printf(")"); } printf("X"); if(k-l-1>0) { printf("("); dfs(k-l-1,sum-(w-1)*a[k-l-1]); printf(")"); } } int main() { //freopen("data.txt","r",stdin); begin(); int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; int sum=0;I=0; for(int i=1;i<=N;++i) { sum+=a[i]; if(sum>=n) { dfs(i,n-(sum-a[i])); break; } } printf("\n"); } return 0; }