void print(int all) { if ( all ) { cerr<<lt<<' '<<rt<<' '; x.print('\n'); } if ( lt == rt ) { if ( !all ) x.print(' '); return; } int md = (lt + rt)/2; if ( l == NULL ) l = new seg(lt,md); if ( r == NULL ) r = new seg(md+1,rt); l->print(all); r->print(all); }
int main(){ scanf("%d",&n); if(n==1){ printf("1\n"); return 0; } f[1].make(1); for(i=2;i<<1<=n;i++){ f[i]=f[i-1]; for(u=1;u<<1<i;u++){ v=i-u-1; if(u==v)f[i]=f[i]+f[u]*(f[u]+1)/2; else f[i]=f[i]+f[u]*f[v]; } for(u=1;u*3<i;u++) for(v=u;v*2<i-u;v++){ w=i-1-u-v; if(u==v && v==w)f[i]=f[i]+f[u]*(f[u]+1)*(f[u]+2)/6; if(u==v && v<w)f[i]=f[i]+f[u]*(f[u]+1)/2*f[w]; if(u<v && v==w)f[i]=f[i]+f[v]*(f[v]+1)/2*f[u]; if(u<v && v<w)f[i]=f[i]+f[u]*f[v]*f[w]; } } ans.make(0); ans=ans+f[n>>1]*(f[n>>1]+1)/2; for(u=1;u*3<n;u++) for(v=u;v*2<n-u;v++){ w=n-1-u-v; if(w<<1>=n)continue; if(u==v && v==w)ans=ans+f[u]*(f[u]+1)*(f[u]+2)/6; if(u==v && v<w)ans=ans+f[u]*(f[u]+1)/2*f[w]; if(u<v && v==w)ans=ans+f[v]*(f[v]+1)/2*f[u]; if(u<v && v<w)ans=ans+f[u]*f[v]*f[w]; } for(u=1;u*4<n;u++) for(v=u;v*3<n-u;v++) for(w=v;w*2<n-u-v;w++){ k=n-1-u-v-w; if(k<<1>=n)continue; if(u==v && v==w && w==k)ans=ans+f[u]*(f[u]+1)*(f[u]+2)*(f[u]+3)/24; if(u==v && v==w && w<k)ans=ans+f[u]*(f[u]+1)*(f[u]+2)/6*f[k]; if(u<v && v==w && w==k)ans=ans+f[v]*(f[v]+1)*(f[v]+2)/6*f[u]; if(u==v && v<w && w<k)ans=ans+f[u]*(f[u]+1)/2*f[w]*f[k]; if(u<v && v==w && w<k)ans=ans+f[v]*(f[v]+1)/2*f[u]*f[k]; if(u<v && v<w && w==k)ans=ans+f[w]*(f[w]+1)/2*f[u]*f[v]; if(u==v && v<w && w==k)ans=ans+(f[u]*(f[u]+1)/2)*(f[w]*(f[w]+1)/2); if(u<v && v<w && w<k)ans=ans+f[u]*f[v]*f[w]*f[k]; } ans.print(); return 0; }