#include using namespace std; const int MOD = 998244353; const int G = 3; long long pow_mod(long long base, long long exp) { long long result = 1; while (exp) { if (exp & 1) result = result * base % MOD; base = base * base % MOD; exp >>= 1; } return result; } void ntt(vector &a, int inv) { int n = a.size(); int bit = 0; while ((1 << bit) < n) bit++; vector rev(n); for (int i = 0; i < n; i++) { rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1)); if (i < rev[i]) swap(a[i], a[rev[i]]); } for (int mid = 1; mid < n; mid <<= 1) { long long wn = pow_mod(G, (MOD - 1) / (mid * 2)); if (inv == -1) wn = pow_mod(wn, MOD - 2); for (int i = 0; i < n; i += mid * 2) { long long w = 1; for (int j = 0; j < mid; j++, w = w * wn % MOD) { long long x = a[i + j], y = w * a[i + j + mid] % MOD; a[i + j] = (x + y) % MOD; a[i + j + mid] = (x - y + MOD) % MOD; } } } if (inv == -1) { long long inv_n = pow_mod(n, MOD - 2); for (int i = 0; i < n; i++) a[i] = a[i] * inv_n % MOD; } } vector poly_mult(vector a, vector b, int maxn = -1) { int n = 1; int len = a.size() + b.size() - 1; while (n < len) n <<= 1; a.resize(n); b.resize(n); ntt(a, 1); ntt(b, 1); for (int i = 0; i < n; i++) a[i] = a[i] * b[i] % MOD; ntt(a, -1); if (maxn != -1 && a.size() > maxn) a.resize(maxn); return a; } vector poly_inv(vector a, int n) { if (n == 1) { return {pow_mod(a[0], MOD - 2)}; } vector b = poly_inv(a, (n + 1) >> 1); int len = 1; while (len < n * 2) len <<= 1; vector a_cpy = a; a_cpy.resize(n); a_cpy.resize(len); b.resize(len); ntt(a_cpy, 1); ntt(b, 1); for (int i = 0; i < len; i++) { b[i] = (2 - a_cpy[i] * b[i] % MOD + MOD) % MOD * b[i] % MOD; } ntt(b, -1); b.resize(n); return b; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int N, M; cin >> N >> M; vector A(N); for (int i = 0; i < N; i++) { cin >> A[i]; } if (N == 0) { for (int i = 0; i < M; i++) { cout << 0 << " "; } cout << endl; return 0; } queue> q; for (int i = 0; i < N; i++) { vector poly(2); poly[0] = 1; poly[1] = (-A[i] % MOD + MOD) % MOD; q.push(poly); } while (q.size() > 1) { auto a = q.front(); q.pop(); auto b = q.front(); q.pop(); auto c = poly_mult(a, b, M + 1); q.push(c); } vector Q = q.front(); Q.resize(M + 1); vector R(M + 1, 0); int min_nm = min(N, M); for (int k = 1; k <= min_nm; k++) { R[k] = (-k * Q[k]) % MOD; if (R[k] < 0) R[k] += MOD; } vector InvQ = poly_inv(Q, M + 1); vector T = poly_mult(R, InvQ, M + 1); for (int k = 1; k <= M; k++) { cout << T[k] << " "; } cout << endl; return 0; }