#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
const ll N = 2097152, P = 998244353, inv2 = 499122177;
ll n, m, A[N], B[N], C[N], D[N], F[N], G[N], r[N], pw[N], iv[N], l, tlen;
ll qpow(ll a, ll k) {
ll res = 1;
for (; k; k >>= 1, (a *= a) %= P) {
if (k & 1) (res *= a) %= P;
}
return res;
}
namespace Poly {
void init() {
for (int i = 1, j = 2; j <= N; ++i, j <<= 1) {
pw[i] = qpow(3, (P - 1) / j);
iv[i] = qpow(pw[i], P - 2);
}
}
void calc(ll len) {
for (l = 1, tlen = 0; l <= len; l <<= 1) ++tlen;
--tlen;
for (int i = 0; i < l; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << tlen);
}
void NTT(ll a[], int type) {
for (int i = 0; i < l; ++i) {
if (i < r[i]) swap(a[i], a[r[i]]);
}
for (int mid = 1, i = 1; mid < l; mid <<= 1, ++i) {
ll w_n = (type == 1) ? pw[i] : iv[i];
for (int j = 0, R = mid << 1; j < l; j += R) {
ll w = 1;
for (int k = 0; k < mid; ++k, w = w * w_n % P) {
ll t = w * a[j + k + mid] % P;
a[j + k + mid] = (a[j + k] + P - t) % P;
a[j + k] = (a[j + k] + t) % P;
}
}
}
if (type == -1) {
ll inv = qpow(l, P - 2);
for (int i = 0; i <= l; ++i) (a[i] *= inv) %= P;
}
}
void mul(ll f[], ll g[], int n) {
calc(n);
NTT(f, 1);
if (f != g) NTT(g, 1);
for (int i = 0; i < l; ++i) (f[i] *= g[i]) %= P;
NTT(f, -1);
if (f != g) NTT(g, -1);
}
void inv(ll f[], ll g[], int n) {
if (n == 1) {
g[0] = qpow(f[0], P - 2);
return;
}
inv(f, g, n + 1 >> 1);
for (int i = 0; i < n; ++i) C[i] = f[i], D[i] = g[i];
for (int i = n; i < l; ++i) C[i] = D[i] = 0;
mul(C, D, n);
mul(C, D, n);
for (int i = 0; i < n; ++i) g[i] = ((2ll * g[i] % P - C[i]) % P + P) % P;
for (int i = 0; i < n; ++i) C[i] = D[i] = 0;
}
void devirate(ll A[], ll B[], ll len) {
for (int i = 1; i < len; ++i) B[i - 1] = i * A[i] % P;
B[len - 1] = 0;
}
void intergral(ll A[], ll B[], ll len) {
for (int i = 1; i < len; ++i) B[i] = A[i - 1] * qpow(i, P - 2) % P;
B[0] = 0;
}
void ln(ll f[], ll g[], int n) {
devirate(f, A, n);
inv(f, B, n);
mul(A, B, n);
intergral(A, g, n);
for (int i = 0; i < n; ++i) A[i] = B[i] = 0;
}
void exp(ll f[], ll g[], int n) {
if (n == 1) {
g[0] = 1;
return;
}
exp(f, g, n + 1 >> 1);
ln(g, C, n);
C[0] = ((f[0] + 1 - C[0]) % P + P) % P;
for (int i = 1; i < n; ++i) C[i] = ((f[i] - C[i]) % P + P) % P;
for (int i = n; i < n << 1; ++i) C[i] = 0;
mul(g, C, n);
for (int i = 0; i < n; ++i) C[i] = 0;
}
void sqrt(ll f[], ll g[], int n) {
if(n == 1) {
g[0] = 1;
return;
}
sqrt(f, g, n + 1 >> 1);
for (int i = 0; i < n << 1; ++i) A[i] = 0;
inv(g, A, n);
mul(A, f, n << 2);
for(int i = 0; i < n; ++i) g[i] = (g[i] + A[i]) * inv2 % P;
}
}
void init() {
Poly::init();
}
void solve() {
cin >> n;
for (int i = 0; i < n; ++i) cin >> F[i];
for (m = 1; m <= n; m <<= 1);
Poly::sqrt(F, G, m);
for (int i = 0; i < n; ++i) cout << G[i] << " \n"[i == n - 1];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int _ = 1;
init();
while (_--) solve();
return 0;
}