int n, mod; int pw[kMaxN], f[kMaxN][kMaxN], g[kMaxN], h[kMaxN], s[kMaxN], res[kMaxN];
intqpow(int bs, int64_t idx = mod - 2){ int ret = 1; for (; idx; idx >>= 1, bs = (int64_t)bs * bs % mod) if (idx & 1) ret = (int64_t)ret * bs % mod; return ret; }
inlineintadd(int x, int y){ return (x + y >= mod ? x + y - mod : x + y); } inlineintsub(int x, int y){ return (x >= y ? x - y : x - y + mod); } inlinevoidinc(int &x, int y){ (x += y) >= mod ? x -= mod : x; } inlinevoiddec(int &x, int y){ (x -= y) < 0 ? x += mod : x; } inlineintgetop(int x){ return (~x & 1) ? 1 : (mod - 1); }
voidprework(){ pw[0] = 1; for (int i = 1; i <= n; ++i) { pw[i] = 2ll * pw[i - 1] % mod; } }
voidgets(){ staticint f[kMaxN][kMaxN]; f[1][0] = f[1][1] = 1; for (int i = 2; i <= n; ++i) { for (int j = 0; j <= i - 1; ++j) { int val = f[i - 1][j]; inc(f[i][j], 1ll * val * (pw[j] - 1) % mod); inc(f[i][j + 1], 1ll * val * (pw[j] - 1) % mod); } } for (int i = 2; i <= n; ++i) { // for (int j = 0; j <= i; ++j) // for (int k = 0; k < j; ++k) // dec(f[i][j], 1ll * f[i][k] * C[i - k][i - j] % mod); // for (int j = 0; j <= i; ++j) inc(s[i], 1ll * getop(i - j) * f[i][j] % mod); // for (int j = 0; j <= i; ++j) std::cerr << f[i][j] << " \n"[j == i]; // std::cerr << s[i] << '\n'; // s[i] = f[i][i - 1]; for (int j = 0; j <= i - 1; ++j) inc(s[i], 1ll * getop(i - 1 - j) * (i - j) % mod * f[i][j] % mod); } }
voiddickdreamer(){ std::cin >> n >> mod; prework(); // g[i] : xuan i ge 3 de gong xian g[0] = 1; for (int i = 2; i <= n - 1; ++i) { for (int j = i - 1; j; --j) inc(g[j], 1ll * pw[n - i] * g[j - 1] % mod); } gets(); // for (int i = 0; i <= n - 2; ++i) std::cerr << g[i] << " \n"[i == n - 2]; f[1][1] = 1; for (int i = 2; i <= n; ++i) { for (int j = 1; j <= i - 1; ++j) { int val = f[i - 1][j]; inc(f[i][j + 1], val); // std::cerr << "??? " << j + 1 << ' ' << i << ' ' << 1ll * val * g[n - i] % mod << '\n'; inc(h[j + 1], 1ll * val * g[n - i] % mod); if (i != n) { inc(f[i][j], 1ll * val * (pw[i - 1] - 1) % mod); } } } for (int i = 2; i <= n; ++i) res[i] = 1ll * h[i] * s[i] % mod; res[0] = qpow(2, n * (n - 1) / 2); for (int i = 1; i <= n; ++i) dec(res[0], res[i]); for (int i = 0; i <= n; ++i) std::cout << res[i] << " \n"[i == n]; }