# include <cstdio>
# include <algorithm>
# include <iostream>
# include <cstring>
using namespace std;
template <class T> inline void Read (T &x) {
x = 0; char ch = getchar ();
while (!isdigit (ch)) ch = getchar ();
while (isdigit (ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar ();
}
const int N = 1e5 + 5, mod = 998244353;
inline int Add (int x, int y) { return (x + y >= mod) ? x + y - mod : x + y; }
inline int Mul (int x, int y) { return 1ll * x * y % mod; }
inline int Ksm (int a, int x, int res = 1) {
for (; x; x >>= 1, a = Mul (a, a)) if (x & 1) res = Mul (res, a);
return res;
}
int rev[4*N], g, gi;
inline int GetRev (int n) {
int li = 1, cnt = 0;
while (li <= n) li <<= 1, ++cnt;
for (register int i = 1; i < li; ++i)
rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (cnt - 1));
return li;
}
inline void NTT (int *a, int op, int li) {
for (register int i = 1; i < li; ++i)
if (i < rev[i]) swap (a[i], a[rev[i]]);
for (register int L = 2, m = 1, wn, u, v; L <= li; L <<= 1, m <<= 1) {
wn = Ksm (op ? g : gi, (mod - 1) / L);
for (register int i = 0; i < li; i += L)
for (register int j = 0, w = 1; j < m; ++j, w = Mul (w, wn)) { u = a[i + j]; v = Mul (w, a[i + m + j]);
a[i + j] = Add (u, v); a[i + m + j] = Add (u, mod - v);
}
}
}
struct Polynome {
int a[4*N];
inline Polynome () { memset (a, 0, sizeof a); }
inline int& operator [] (int x) { return a[x]; }
} fz1, fz2, F, G, H, P;
inline void GetIn (int *a, int n) {
for (register int i = 0; i < n; ++i) Read (a[i]);
}
inline void GetOut (int *a, int n) {
for (register int i = 0; i < n; ++i) printf ("%d ", a[i]);
puts ("");
}
inline void GetRev (int *a, int n) {
for (register int i = 0; i <= (n - 1) / 2; ++i) swap (a[i], a[n - 1 - i]);
}
inline void GetInv1 (int *a, int n) {
if (n == 1) return fz1[0] = Ksm (a[0], mod - 2), void ();
GetInv1 (a, (n + 1) / 2); int li = GetRev (2 * n - 1), invli;
for (register int i = 0; i < n; ++i) fz2[i] = a[i];
for (register int i = n; i < li; ++i) fz2[i] = 0;
NTT (fz1.a, 1, li); NTT (fz2.a, 1, li);
for (register int i = 0; i < li; ++i)
fz1[i] = Add (Mul (2, fz1[i]), mod - Mul (fz2[i], Mul (fz1[i], fz1[i])));
NTT (fz1.a, 0, li); invli = Ksm (li, mod - 2);
for (register int i = 0; i < n; ++i) fz1[i] = Mul (fz1[i], invli);
}
inline void GetInv (int *a, int n) {
memset (fz1.a, 0, sizeof fz1.a); GetInv1 (a, n);
for (register int i = 0; i < n; ++i) a[i] = fz1[i];
}
inline void GetDiv (int *a, int *b, int n, int m) {
GetRev (a, n + 1); GetRev (b, m + 1);
for (register int i = n - m + 1; i < n; ++i) a[i] = 0;
for (register int i = n - m + 1; i < m; ++i) b[i] = 0;
GetInv (b, n - m + 1); int li = GetRev (2 * (n - m)), invli;
NTT (a, 1, li); NTT (b, 1, li);
for (register int i = 0; i < li; ++i) a[i] = Mul (a[i], b[i]);
NTT (a, 0, li); invli = Ksm (li, mod - 2);
for (register int i = 0; i < n - m + 1; ++i) a[i] = Mul (a[i], invli);
for (register int i = n - m + 1; i < li; ++i) a[i] = 0; GetRev (a, n - m + 1);
}
int n, m;
inline void Init () {
Read (n); Read (m); GetIn (F.a, n + 1); GetIn (G.a, m + 1);
for (register int i = 0; i <= n; ++i) H[i] = F[i];
for (register int i = 0; i <= m; ++i) P[i] = G[i];
g = 3; gi = Ksm (g, mod - 2);
}
inline void Solve () {
GetDiv (H.a, G.a, n, m); GetOut (H.a, n - m + 1);
int li = GetRev (n + m), invli;
for (register int i = m; i < li; ++i) H[i] = P[i] = F[i] = 0;
NTT (F.a, 1, li); NTT (P.a, 1, li); NTT (H.a, 1, li);
for (register int i = 0; i < li; ++i) F[i] = Add (F[i], mod - Mul (P[i], H[i]));
NTT (F.a, 0, li); invli = Ksm (li, mod - 2);
for (register int i = 0; i < li; ++i) F[i] = Mul (F[i], invli);
GetOut (F.a, m);
}
int main () {
Init (); Solve ();
return 0;
}