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;
inline int read() {
  char c = getchar();
  int x = 0, f = 1;
  while ((c < '0' || c > '9') && c ^ '-') c = getchar();
  if (c == '-') f = -1, c = getchar();
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + c - 48;
    c = getchar();
  }
  return x * f;
}
const int N = 1e5 + 10;
const int mo = 998244353, Gi = 3;
int rev[N << 2], b[N << 2], g[N << 2], f[N << 2], n, m;
inline int qumo(int x) { return x + ((x >> 31) & mo); }
int kg[N << 2];
inline int qp(int x, int y) {
  int ans = 1;
  while (y) {
    if (y & 1) ans = 1ll * ans * x % mo;
    x = 1ll * x * x % mo;
    y >>= 1;
  }
  return ans;
}
int lim, l;
inline void ntt(int d[], int pan) {
  for (int i = 0; i < lim; i++)
    if (i > rev[i]) swap(d[i], d[rev[i]]);
  for (int bj = 1; bj < lim; bj <<= 1) {
    int wn = qp(Gi, (mo - 1) / (bj << 1));
    if (pan) wn = qp(wn, mo - 2);
    for (int ks = 0; ks < lim; ks += (bj << 1)) {
      int w = 1;
      for (int i = 0; i < bj; i++, w = 1ll * w * wn % mo) {
        int x = d[ks + i], y = 1ll * w * d[ks + bj + i] % mo;
        d[ks + i] = qumo(x + y - mo);
        d[ks + bj + i] = qumo(x - y);
      }
    }
  }
  if (pan) {
    const int ni = qp(lim, mo - 2);
    for (int i = 0; i < lim; i++) d[i] = 1ll * d[i] * ni % mo;
  }
}
int tmp[N << 2];
const int inv2 = qp(2, mo - 2);
inline void qiuni(int dao) {
  b[0] = qp(kg[0], mo - 2);
  for (int i = 1; i < dao; i++) b[i] = 0;
  int lao = 1;
  while (lao < dao) {
    int xin = lao << 1;
    lim = 1, l = 0;
    while (lim <= (xin + lao) - 2) lim <<= 1, l++;
    for (int i = 1; i < lim; i++)
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1), tmp[i] = 0;
    tmp[0] = 0;
    for (int i = 0; i < xin; i++) tmp[i] = kg[i];
    ntt(b, 0);
    ntt(tmp, 0);
    for (int i = 0; i < lim; i++) tmp[i] = 1ll * b[i] * b[i] % mo * tmp[i] % mo;
    ntt(tmp, 1);
    ntt(b, 1);
    for (int i = 0; i < lim; i++) b[i] = qumo(qumo((b[i] << 1) - mo) - tmp[i]);
    for (int i = xin; i < lim; i++) b[i] = 0;
    lao = xin;
  }
}
inline void solve() {
  for (int i = 0; i <= m; i++) {
    g[i] = qumo(-g[i]);
    g[i] = qumo((g[i] << 1) - mo);
    g[i] = qumo((g[i] << 1) - mo);
  }
  g[0] = qumo(1 + g[0] - mo);
  kg[0] = 1;
  int lao = 1;
  qiuni(lao);
  while (lao < m + 1) {
    int xin = lao << 1;
    qiuni(xin);
    lim = 1, l = 0;
    while (lim <= (lao << 1) - 2) lim <<= 1, l++;
    for (int i = 1; i < lim; i++)
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);
    ntt(kg, 0);
    for (int i = 0; i < lim; i++) kg[i] = 1ll * kg[i] * kg[i] % mo;
    ntt(kg, 1);
    for (int i = 0; i < xin; i++) kg[i] = qumo(kg[i] + g[i] - mo);
    for (int i = xin; i < lim; i++) kg[i] = 0;
    lim = 1, l = 0;
    while (lim <= xin + lao - 2) lim <<= 1, l++;
    for (int i = 1; i < lim; i++)
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);
    ntt(b, 0);
    ntt(kg, 0);
    for (int i = 0; i < lim; i++) kg[i] = 1ll * kg[i] * b[i] % mo;
    ntt(b, 1);
    ntt(kg, 1);
    for (int i = 0; i < lim; i++) kg[i] = 1ll * kg[i] * inv2 % mo;
    for (int i = xin; i < lim; i++) kg[i] = 0;
    lao = xin;
  }
  memset(b, 0, sizeof(b));
  kg[0] = qumo(1 + kg[0] - mo);
  for (int i = m + 1; i < lao; i++) kg[i] = 0;
  b[0] = qp(kg[0], mo - 2);
  lao = 1;
  while (lao < m + 1) {
    int xin = lao << 1;
    lim = 1, l = 0;
    while (lim <= (xin + lao - 2)) lim <<= 1, l++;
    for (int i = 1; i < lim; i++)
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1), tmp[i] = 0;
    tmp[0] = 0;
    for (int i = 0; i < xin; i++) tmp[i] = kg[i];
    ntt(b, 0);
    ntt(tmp, 0);
    for (int i = 0; i < lim; i++) tmp[i] = 1ll * b[i] * b[i] % mo * tmp[i] % mo;
    ntt(b, 1);
    ntt(tmp, 1);
    for (int i = 0; i < lim; i++) b[i] = qumo(qumo((b[i] << 1) - mo) - tmp[i]);
    for (int i = xin; i < lim; i++) b[i] = 0;
    lao = xin;
  }
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++) g[read()] = 1;
  for (int i = m + 1; i <= N - 10; i++) g[i] = 0;
  solve();
  for (int i = 1; i <= m; i++) cout << qumo((b[i] << 1) - mo) << "\n";
  return 0;
}