Skip to content

Instantly share code, notes, and snippets.

@zeptometer
Created October 16, 2011 12:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zeptometer/1290813 to your computer and use it in GitHub Desktop.
Save zeptometer/1290813 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#define M_MAX 18
int m[M_MAX],k[M_MAX];
void doit(int n){
int i=0,j=0,a,l,r,nl,nr;
if(n==1){printf("X");return;}
for(i=0;n>k[i];i++);
a=i;
for(i=j=0;n>j+k[a-1];i++)
j+=m[i]*m[a-i-1];
l=i-1;r=a-i;
if(l==0){
printf("X(");
doit(n-k[a-1]+k[r-1]);
printf(")");
}else if(r==0){
printf("(");
doit(n-(k[a]-m[a-1])+k[l-1]);
printf(")X");
}else{
int aho = n-k[a-1]-j+m[r]*m[l];
nl=(aho-1)/m[r]+1;
nr=aho%m[r]+1;
printf("(");
doit(nl+k[l-1]);
printf(")X(");
doit(nr+k[r-1]);
printf(")");
}
}
int main(){
int i,j,n;
m[0]=m[1]=1;
for(i=2; i<=M_MAX; i++)
for(j=0; j<i; j++)
m[i] += m[j]*m[i-j-1];
for(i=1;i<=M_MAX;i++)
k[i] += m[i]+k[i-1];
for(;;){
scanf("%d",&n);
if(!n)break;
doit(n);
printf("\n");
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment