func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 5e3 + 51, MOD = 998244353;   int n, res;   int p[MAXN][MAXN], fact[MAXN], finv[MAXN];   inline int read() {     register int num = 0, neg = 1;     register char ch = getchar();     while (!isdigit(ch) && ch !=  - ) {       ch = getchar();     }     if (ch ==  - ) {       neg = -1;       ch = getchar();     }     while (isdigit(ch)) {       num = (num << 3) + (num << 1) + (ch -  0 );       ch = getchar();     }     return num * neg;   }   inline int qpow(int base, int exponent) {     int res = 1;     while (exponent) {       if (exponent & 1) {         res = (long long int)res * base % MOD;       }       base = (long long int)base * base % MOD, exponent >>= 1;     }     return res;   }   inline void setup(int cnt) {     fact[0] = fact[1] = finv[0] = 1;     for (register int i = 0; i <= cnt; i++) {       p[i][0] = 1;     }     for (register int i = 1; i <= cnt; i++) {       for (register int j = 1; j <= i; j++) {         p[i][j] = ((long long int)(i - j) * p[i - 1][j - 1] % MOD +                    (long long int)(j + 1) * p[i - 1][j] % MOD) %                   MOD;       }     }     for (register int i = 2; i <= cnt; i++) {       fact[i] = (long long int)fact[i - 1] * i % MOD;     }     finv[cnt] = qpow(fact[cnt], MOD - 2);     for (register int i = cnt - 1; i; i--) {       finv[i] = (long long int)finv[i + 1] * (i + 1) % MOD;     }   }   inline int binom(int m, int n) {     return (long long int)fact[m] * finv[n] % MOD * finv[m - n] % MOD;   }   int main() {     setup(n = read());     for (register int k = 0; k < n; k++) {       res = 0;       for (register int i = max(k, 1); i <= n; i++) {         res = (res +                (long long int)binom(n, i) * p[i][k] % MOD * fact[n - i] % MOD) %               MOD;       }       printf( %d  , res);     }     puts(  );   }   