func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize(2)   using namespace std;   void qread(int &x) {     int neg = 1;     x = 0;     char c = getchar();     while (c <  0  || c >  9 ) {       if (c ==  - ) neg = -1;       c = getchar();     }     while (c >=  0  && c <=  9 ) x = 10 * x + c -  0 , c = getchar();     x *= neg;   }   const int maxn = 405;   int test, n, mod;   int dp[maxn][maxn * 2], fac[maxn];   int quickpow(int x, int pow) {     int res = 1;     for (; pow; pow >>= 1) {       if (pow & 1) res = 1LL * res * x % mod;       x = 1LL * x * x % mod;     }     return res;   }   void work() {     for (int(i) = 1; (i) <= 400; i++) dp[i][i + 400] = 1;     for (int(i) = 1; (i) <= 400; i++) {       int inv = quickpow(dp[i][i], mod - 2);       for (int j = i + 1; j <= 2 * 400; j++)         dp[i][j] = 1LL * dp[i][j] * inv % mod;       dp[i][i] = 1;       for (int j = i + 1; j <= 400; j++) {         for (int k = i + 1; k <= 2 * 400; k++)           dp[j][k] = (dp[j][k] - 1LL * dp[j][i] * dp[i][k] % mod + mod) % mod;         dp[j][i] = 0;       }     }   }   int main() {     scanf( %d%d , &test, &mod);     fac[0] = 1;     for (int(i) = 1; (i) <= 400; i++) fac[i] = 1LL * fac[i - 1] * i % mod;     for (int(i) = 1; (i) <= 400; i++) {       dp[i][1] = fac[i];       for (int k = 2; k <= i; k++) {         for (int m = 0; m <= i - k; m++)           dp[i][k] =               (dp[i][k] + 1LL * fac[m + 1] * dp[i - m - 1][k - 1] % mod) % mod;       }     }     work();     while (test--) {       scanf( %d , &n);       if (n == 2) {         puts( 2 );         continue;       }       int ans = ((mod - dp[n][401]) % mod + ((n & 1) ? 2 : -2) + mod) % mod;       printf( %d n , ans);     }     return 0;   }   