#include /* #include #include namespace mp = boost::multiprecision; using bint = mp::cpp_int; */ #include #define rep(i,n) for (int i = 0; i < int(n); ++i) #define repp(i,n,m) for (int i = m; i < int(n); ++i) #define repb(i,n) for (int i = int(n)-1; i >= 0; --i) #define fi first #define se second #define endl "\n" using namespace std; using namespace atcoder; using ll = long long; using ld = long double; using P = pair; using PL = pair; using Pxy = pair; using pil = pair; using pli = pair; using ppi = pair; using pip = pair; const int INF = 1001001007; const long long mod1 = 1000000007LL; const long long mod2 = 998244353LL; const ll inf = 2e18; const ld pi = 3.14159265358979323; const ld eps = 1e-7; const char _ = ' '; templateistream &operator>>(istream &is,vector &v){for(auto &e:v)is>>e;return is;} templateostream &operator<<(ostream &os,const vector &v){if(v.size()!=0){rep(i,v.size())os<istream &operator>>(istream &is,vector> &v){for(auto &e:v)is>>e;return is;} templateostream &operator<<(ostream &os,const vector> &v){if(v.size()!=0){for(auto &e:v)os<bool range(T a,T b,T x){return (a<=x&&xbool rrange(T a,T b,T c,T d,T x,T y){return (range(a,c,x)&&range(b,d,y));} templatevoid rev(vector &v){reverse(v.begin(),v.end());} void revs(string &s) {reverse(s.begin(),s.end());} templatevoid sor(vector &v, int f=0){sort(v.begin(),v.end());if(f!=0) rev(v);} templatebool chmin(T &a,const T &b){if(a>b){a=b;return true;}return false;} templatebool chmax(T &a,const T &b){if(avoid eru(vector &v){sor(v);v.erase(unique(v.begin(),v.end()),v.end());} templateT cel(T a,T b){if(a%b==0)return a/b;return a/b +1;} void o(){cout<<"!?"<void o(T a){cout<void o2(T a,U b){cout<void o2(pair a){o2(a.first,a.second);} templatevoid o3(T a,U b,V c){cout<void mout(T a){cout<void dame(bool t, T s){if(!t){cout << s << endl;exit(0);}} void fast_io(){cin.tie(0); ios::sync_with_stdio(0); cout< dx = {0,1,0,-1}; vector dy = {1,0,-1,0}; const string ALP = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const string alp = "abcdefghijklmnopqrstuvwxyz"; const string NUM = "0123456789"; void solve(){ int n; cin >> n; using mint = modint1000000007; vector> dp(2*n+3,vector(n+1,0)); dp[0][0] = 1; rep(i,n) { vector> ep(2*n+3,vector(n+1,0)); rep(j,2*n+1) rep(k,n){ mint x = dp[j][k]; if (j < k) continue; if (j == 0){ ep[j+1][k+1] += x; ep[j+2][k] += x; continue; } ep[j+1][k+1] += x; ep[j][k] += x * mint(k); ep[j][k+1] += x * mint(j - k); ep[j][k] += x * mint(j) * mint(j-1); ep[j+1][k] += x * mint(j) * mint(2); ep[j+2][k] += x; } dp = ep; } mint ans = 0; rep(i,n+1) { ans += dp[i][i]; //mout(ans); } mout(ans); } int main(){ fast_io(); int t = 1; //cin >> t; while (t--) solve(); }