/* -*- coding: utf-8 -*- * * 1492.cc: No.1492 01文字列と転倒 - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 100; const int MAX_N2 = MAX_N * 2; const int MAX_NN = MAX_N * MAX_N; /* typedef */ typedef long long ll; /* global variables */ int dp[2][MAX_N + 1][MAX_NN + 1]; /* subroutines */ inline void addmod(int &a, int b, int m) { a = (a + b) % m; } /* main */ int main() { int n, m; scanf("%d%d", &n, &m); int n2 = n * 2, nn = n * n; dp[0][0][0] = 1; int cur = 0, nxt = 1; for (int i = 0; i < n2; i++) { memset(dp[nxt], 0, sizeof(dp[nxt])); int maxj = min(i + 1, n); for (int j = 0; j <= n; j++) { int zj = i - j; for (int k = 0; k <= nn; k++) if (dp[cur][j][k]) { // -> 0 if (zj < maxj) addmod(dp[nxt][j][k + j], dp[cur][j][k], m); // -> 1 if (zj > j && j < maxj) addmod(dp[nxt][j + 1][k], dp[cur][j][k], m); } } swap(cur, nxt); } for (int k = 0; k <= nn; k++) printf("%d\n", dp[cur][n][k]); return 0; }