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 N = 1 << 18;
const unsigned long long mod = 998244353;
const unsigned long long inv2 = (mod + 1) >> 1;
template <typename T>
inline T chkmax(T _A, T _B) {
  return _A > _B ? _A : _B;
}
template <typename T>
inline T chkmin(T _A, T _B) {
  return _A < _B ? _A : _B;
}
inline void read(unsigned long long &x) {
  x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
}
inline void file() {}
int rev[N];
unsigned long long n, m, Base, len;
unsigned long long C[N], F[N], iQ[N], R[N];
inline void init() {
  for (Base = 1, len = 0; Base <= m; Base <<= 1) len++;
}
inline unsigned long long qpow(unsigned long long a, unsigned long long b) {
  unsigned long long ret = 1;
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1) ret = ret * a % mod;
  return ret;
}
inline void NTT(unsigned long long *x, int Base, int flag) {
  for (int i = 1, iend = Base - 1; i <= iend; ++i)
    if (i < rev[i]) swap(x[i], x[rev[i]]);
  for (int L = 2; L <= Base; L <<= 1) {
    unsigned long long wn = qpow(3, mod / L);
    if (flag == -1) wn = qpow(wn, mod - 2);
    for (int M = 0; M < Base; M += L) {
      unsigned long long w = 1, *l = x + M, *r = x + M + (L >> 1), X, Y;
      for (int i = 0, iend = (L >> 1) - 1; i <= iend; ++i) {
        X = *l, Y = *r * w % mod;
        *l = (X + Y) % mod;
        *r = (X + mod - Y) % mod;
        w = w * wn % mod, ++l, ++r;
      }
    }
  }
  if (flag == -1) {
    unsigned long long inv = qpow(Base, mod - 2);
    for (int i = 0, iend = Base - 1; i <= iend; ++i) x[i] = x[i] * inv % mod;
  }
}
inline void Inv(unsigned long long *A, unsigned long long *B, int n) {
  if (n == 1) {
    B[0] = qpow(A[0], mod - 2);
    return;
  }
  Inv(A, B, n >> 1);
  for (int i = 0, iend = n - 1; i <= iend; ++i) R[i] = A[i], R[i + n] = 0;
  n <<= 1;
  for (int i = 1, iend = n - 1; i <= iend; ++i)
    rev[i] = rev[i >> 1] >> 1 | ((i & 1) * (n >> 1));
  NTT(R, n, 1);
  NTT(B, n, 1);
  for (int i = 0, iend = n - 1; i <= iend; ++i)
    B[i] = B[i] * (2 + mod - B[i] * R[i] % mod) % mod;
  NTT(B, n, -1);
  n >>= 1;
  for (int i = 0, iend = n - 1; i <= iend; ++i) B[n + i] = 0;
}
inline void Sqrt(unsigned long long *A, unsigned long long *Q, int n) {
  if (n == 1) {
    Q[0] = 1;
    return;
  }
  Sqrt(A, Q, n >> 1);
  for (int i = 0, iend = n - 1; i <= iend; ++i) iQ[i] = 0;
  Inv(Q, iQ, n);
  for (int i = 0, iend = n - 1; i <= iend; ++i) R[i] = A[i], R[i + n] = 0;
  n <<= 1;
  for (int i = 1, iend = n - 1; i <= iend; ++i)
    rev[i] = rev[i >> 1] >> 1 | ((i & 1) * (n >> 1));
  NTT(iQ, n, 1), NTT(Q, n, 1), NTT(R, n, 1);
  for (int i = 0, iend = n - 1; i <= iend; ++i)
    Q[i] = (Q[i] + R[i] * iQ[i]) % mod * inv2 % mod;
  NTT(Q, n, -1);
  n >>= 1;
  for (int i = 0, iend = n - 1; i <= iend; ++i) Q[n + i] = 0;
}
int main() {
  file();
  unsigned long long x;
  read(n), read(m);
  init();
  C[0]++;
  for (int i = 1, iend = n; i <= iend; ++i) read(x), C[x] += mod - 4;
  for (int i = 0, iend = m; i <= iend; ++i)
    if (C[i] >= mod) C[i] %= mod;
  Sqrt(C, F, Base);
  F[0]++;
  for (int i = 0, iend = Base; i <= iend; ++i) C[i] = 0;
  Inv(F, C, Base);
  for (int i = 1, iend = m; i <= iend; ++i) printf("%lld\n", C[i] * 2 % mod);
  return 0;
}