Problem: Our child likes computer science very much, especially he likes binary trees.

Consider the sequence of n distinct positive integers: c1, c2, ..., cn. The child calls a vertex-weighted rooted binary tree good if and only if for every vertex v, the weight of v is in the set {c1, c2, ..., cn}. Also our child thinks that the weight of a vertex-weighted tree is the sum of all vertices' weights.

Given an integer m, can you for all s (1 ≤ s ≤ m) calculate the number of good vertex-weighted rooted binary trees with weight s? Please, check the samples for better understanding what trees are considered different.

We only want to know the answer modulo 998244353 (7 × 17 × 223 + 1, a prime number).

Input

The first line contains two integers n, m (1 ≤ n ≤ 105; 1 ≤ m ≤ 105). The second line contains n space-separated pairwise distinct integers c1, c2, ..., cn. (1 ≤ ci ≤ 105).

Output

Print m lines, each line containing a single integer. The i-th line must contain the number of good vertex-weighted rooted binary trees whose weight exactly equal to i. Print the answers modulo 998244353 (7 × 17 × 223 + 1, a prime number).

Examples

Input

2 3
1 2


Output

1
3
9


Input

3 10
9 4 3


Output

0
0
1
1
0
2
4
2
6
15


Input

5 10
13 10 6 4 15


Output

0
0
0
1
0
1
0
2
0
5

Note

In the first example, there are 9 good vertex-weighted rooted binary trees whose weight exactly equal to 3:

<image>

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
const int n7 = 1201234;
const long long mo = 998244353;
int n, m, a[n7];
long long g[n7];
int rd() {
  int shu = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) shu = (shu << 1) + (shu << 3) + (ch ^ 48), ch = getchar();
  return shu;
}
long long Dpow(long long p, long long q) {
  long long tot = 1;
  while (q) {
    if (q & 1) tot = tot * p % mo;
    p = p * p % mo, q = q >> 1;
  }
  return tot;
}
namespace POLY {
const int q7 = n7;
long long ori1[q7], ori2[q7], rv[q7];
long long Dpow(long long p, long long q) {
  long long tot = 1;
  while (q) {
    if (q & 1) tot = tot * p % mo;
    p = p * p % mo, q = q >> 1;
  }
  return tot;
}
void Tpre(int n) {
  long long inv = Dpow(3, mo - 2);
  for (int len = 2; len <= n + 1; len = len << 1) {
    ori1[len] = Dpow(3, (mo - 1) / len);
    ori2[len] = Dpow(inv, (mo - 1) / len);
  }
}
void Trev(int n) {
  for (int i = 0; i <= n; ++i) {
    rv[i] = (rv[i >> 1] >> 1);
    if (i & 1) rv[i] = rv[i] | ((n + 1) >> 1);
  }
}
int totwo(int x) {
  int z = 1;
  while (z <= x) z = z << 1;
  return z;
}
void NTT(long long *f, int n, bool sys) {
  for (int i = 0; i <= n; ++i) {
    if (i < rv[i]) swap(f[i], f[rv[i]]);
  }
  for (int len = 1; len < n + 1; len = len << 1) {
    int far = len << 1;
    long long ori = sys ? ori2[far] : ori1[far];
    for (int i = 0; i <= n; i = i + far) {
      long long z = 1;
      for (int j = i; j <= i + len - 1; ++j) {
        long long tmp = z * f[len + j] % mo;
        f[len + j] = (f[j] - tmp + mo) % mo;
        f[j] = (f[j] + tmp) % mo;
        z = z * ori % mo;
      }
    }
  }
  if (sys) {
    long long inv = Dpow(n + 1, mo - 2);
    for (int i = 0; i <= n; ++i) f[i] = f[i] * inv % mo;
  }
}
void Tmul(long long *f, long long *g, int n) {
  Trev(n);
  NTT(f, n, 0), NTT(g, n, 0);
  for (int i = 0; i <= n; ++i) f[i] = f[i] * g[i] % mo;
  NTT(f, n, 1);
}
void Tmulz(long long *f, long long *g, long long *S, int n) {
  const int p7 = (n << 1) + 10;
  long long A[p7], B[p7];
  memset(A, 0, sizeof A), memset(B, 0, sizeof B);
  for (int i = 0; i <= n; ++i) A[i] = f[i], B[i] = g[i];
  Trev(n);
  NTT(A, n, 0), NTT(B, n, 0);
  for (int i = 0; i <= n; ++i) A[i] = A[i] * B[i] % mo;
  NTT(A, n, 1);
  for (int i = 0; i <= n; ++i) S[i] = A[i];
}
void Tinv(long long *f, long long *S, int n) {
  const int p7 = (n << 1) + 10;
  long long s[p7], A[p7], B[p7];
  memset(A, 0, sizeof A), memset(B, 0, sizeof B), memset(s, 0, sizeof s);
  s[0] = Dpow(f[0], mo - 2);
  for (int len = 2; len <= n + 1; len = len << 1) {
    int far = (len << 1) - 1;
    for (int i = 0; i <= len - 1; ++i) A[i] = f[i], B[i] = s[i];
    Trev(far);
    NTT(A, far, 0), NTT(B, far, 0);
    for (int i = 0; i <= far; ++i)
      s[i] = (B[i] * 2 % mo - A[i] * B[i] % mo * B[i] % mo + mo) % mo;
    NTT(s, far, 1);
    for (int i = len; i <= far; ++i) s[i] = 0;
  }
  for (int i = 0; i <= n; ++i) S[i] = s[i];
}
void Tderiv(long long *f, long long *S, int n) {
  const int p7 = (n) + 10;
  long long s[p7];
  s[n] = 0;
  for (int i = 1; i <= n; ++i) s[i - 1] = f[i] * i % mo;
  for (int i = 0; i <= n; ++i) S[i] = s[i];
}
void Tint(long long *f, long long *S, int n) {
  const int p7 = (n) + 10;
  long long s[p7];
  s[0] = 0;
  for (int i = 0; i <= n - 1; ++i) s[i + 1] = f[i] * Dpow(i + 1, mo - 2) % mo;
  for (int i = 0; i <= n; ++i) S[i] = s[i];
}
void Tln(long long *f, long long *S, int n) {
  const int p7 = (n << 1) + 10;
  long long A[p7], B[p7];
  memset(A, 0, sizeof A), memset(B, 0, sizeof B);
  for (int i = 0; i <= n; ++i) A[i] = f[i];
  Tderiv(A, B, n);
  Tinv(A, A, n);
  Tmul(A, B, n + n + 1);
  Tint(A, A, n);
  for (int i = 0; i <= n; ++i) S[i] = A[i];
}
void Texp(long long *f, long long *S, int n) {
  const int p7 = (n << 1) + 10;
  long long s[p7], A[p7], B[p7], C[p7];
  memset(A, 0, sizeof A), memset(B, 0, sizeof B), memset(C, 0, sizeof C),
      memset(s, 0, sizeof s);
  s[0] = 1;
  for (int len = 2; len <= n + 1; len = len << 1) {
    int far = (len << 1) - 1;
    for (int i = 0; i <= len - 1; ++i) A[i] = f[i], B[i] = s[i];
    Tln(B, C, len - 1);
    for (int i = 0; i <= len - 1; ++i) C[i] = (A[i] - C[i] + mo) % mo;
    C[0] = (C[0] + 1) % mo;
    Trev(far);
    NTT(B, far, 0), NTT(C, far, 0);
    for (int i = 0; i <= far; ++i) s[i] = B[i] * C[i] % mo;
    NTT(s, far, 1);
    for (int i = len; i <= far; ++i) s[i] = 0;
  }
  for (int i = 0; i <= n; ++i) S[i] = s[i];
}
void Tsqrt(long long *f, long long *S, int n) {
  const int p7 = (n << 1) + 10;
  long long s[p7], A[p7], B[p7], C[p7];
  memset(A, 0, sizeof A), memset(B, 0, sizeof B), memset(C, 0, sizeof C),
      memset(s, 0, sizeof s);
  s[0] = 1;
  long long inv = Dpow(2, mo - 2);
  for (int len = 1; len <= n + 1; len = len << 1) {
    int far = (len << 1) - 1;
    for (int i = 0; i <= len - 1; ++i) A[i] = f[i], B[i] = s[i];
    Tinv(B, C, len - 1);
    Trev(far);
    NTT(A, far, 0), NTT(C, far, 0);
    for (int i = 0; i <= far; ++i) s[i] = A[i] * C[i] % mo;
    NTT(s, far, 1);
    for (int i = 0; i <= len - 1; ++i) s[i] = (s[i] + B[i]) % mo * inv % mo;
    for (int i = len; i <= far; ++i) s[i] = 0;
  }
  for (int i = 0; i <= n; ++i) S[i] = s[i];
}
void Tpow(long long *f, long long *S, int n, long long K) {
  const int p7 = (n << 1) + 10;
  long long s[p7];
  memset(s, 0, sizeof s);
  Tln(f, s, n);
  for (int i = 0; i <= n; ++i) s[i] = s[i] * K % mo;
  Texp(s, s, n);
  for (int i = 0; i <= n; ++i) S[i] = s[i];
}
void Tturn(long long *f, int n) {
  for (int i = 0; i <= n / 2; ++i) swap(f[i], f[n - i]);
}
void Tdiv(long long *f, long long *g, long long *S, long long *Syu, int n,
          int m) {
  const int p7 = ((n + m) << 2) + 10;
  long long A[p7], B[p7], s[p7], sz[p7], syu[p7];
  memset(A, 0, sizeof A), memset(B, 0, sizeof B), memset(s, 0, sizeof s),
      memset(sz, 0, sizeof sz);
  for (int i = 0; i <= n; ++i) A[i] = f[i];
  for (int i = 0; i <= m; ++i) B[i] = g[i];
  Tturn(A, n), Tturn(B, m);
  int z1 = totwo(n - m + 1) - 1;
  Tinv(B, B, z1);
  int z2 = totwo(n + n - m + 1) - 1;
  for (int i = n - m + 1; i <= z2; ++i) B[i] = 0;
  Tmul(A, B, z2);
  for (int i = 0; i <= n - m; ++i) s[i] = A[i];
  Tturn(s, n - m);
  for (int i = 0; i <= n - m; ++i) sz[i] = s[i];
  int z3 = totwo(n + 1) - 1;
  for (int i = 0; i <= m; ++i) B[i] = g[i];
  for (int i = m + 1; i <= z3; ++i) B[i] = 0;
  Tmul(B, s, z3);
  for (int i = 0; i <= m; ++i) syu[i] = (f[i] - B[i] + mo) % mo;
  for (int i = 0; i <= n - m; ++i) S[i] = sz[i];
  for (int i = 0; i <= m; ++i) Syu[i] = syu[i];
}
}  // namespace POLY
int main() {
  n = rd(), m = rd();
  for (int i = 1; i <= n; ++i) g[rd()] = mo - 4;
  g[0] = 1;
  int len = m;
  m = POLY::totwo(m);
  POLY::Tpre(m << 1);
  POLY::Tsqrt(g, g, m);
  g[0] = (g[0] + 1) % mo;
  POLY::Tinv(g, g, m);
  for (int i = 1; i <= len; ++i) printf("%lld\n", g[i] * 2 % mo);
  return 0;
}