#include #include #include #include #include #include using namespace std; const long long MOD=998244353; long long f[1001][1001],c[1001][1001]; long long fc[1001]; long long ans[1001]; bool added[1001][1001]; main() { long long q; cin>>q; f[0][0]=1; for (int i=0;i<=q;i++) for (int j=0;j<=i;j++) { if (j==0) c[i][j]=1; else if (i==j) c[i][j]=1; else if (j==1) c[i][j]=i; else c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD; } for (int n=1;n<=q;n++) { for (int first=1;first<=((n+1)/2);first++) { int Lside=max(0,first-2); int Rside=max(0,n-first-1); for (int Ltake=(Lside+2)/3;Ltake<=(Lside+1)/2;Ltake++) // optimize for (int Rtake=(Rside+2)/3;Rtake<=(Rside+1)/2;Rtake++) // optimize { long long val=(((f[Lside][Ltake]*f[Rside][Rtake])%MOD)*c[Ltake+Rtake][Ltake])%MOD; if ( first < (n-first+1) ) val=(val*2LL)%MOD; f[n][1+Ltake+Rtake]+=val; f[n][1+Ltake+Rtake]%=MOD; } } } fc[0]=1; for (long long x=1;x<=q;x++) fc[x]=(fc[x-1]*x)%MOD; for (int n=q;n<=q;n++) { ans[n]=0; for (int i=(n+2)/3;i<=(n+1)/2;i++) if (f[n][i]) { ans[n]+=(f[n][i]*fc[n-i])%MOD; ans[n]%=MOD; } } cout<