输入数据31117532写成31117531,导致我调了2小时,你妹。。
思想是化整为零。。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
const int maxN=19;
int cat[maxN],sum[maxN+1];
void build(int d,int k){
int i;
if(d==0) return;
for(i=0;i<d;i++)
if(k>cat[i]*cat[d-i-1])
k-=cat[i]*cat[d-i-1];
else
break;
if(i) cout<<'(';
if(k%cat[d-i-1]==0) build(i,k/cat[d-i-1]);
else build(i,k/cat[d-i-1]+1);
if(i) cout<<')';
cout<<'X';
if(d-i-1) cout<<'(';
if(k%cat[d-i-1]==0) build(d-i-1,cat[d-i-1]);
else build(d-i-1,k%cat[d-i-1]);
if(d-i-1) cout<<')';
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
int n,m;
cat[0]=1;
for(int i=0;i<maxN;i++)
for(int j=0;j<i;j++)
cat[i]+=cat[j]*cat[i-j-1];
for(int i=1;i<maxN;i++){
sum[i]=sum[i-1]+cat[i];
}
while(cin>>n,n){
for(int i=1;i<maxN;i++)
if(n<=sum[i]){
m=i;
break;
}
build(m,n-sum[m-1]);
cout<<endl;
}
return 0;
}