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>
const int N = 262150;
const int mod = 998244353;
int rnk[N], c[N], d[N], e[N], f[N], C[N], g[N];
int INV, n, m, x;
int ksm(int u, int v) {
  int res = 1;
  for (; v; v >>= 1, u = 1ll * u * u % mod)
    if (v & 1) res = 1ll * res * u % mod;
  return res;
}
inline void swap(int &u, int &v) {
  int o = u;
  u = v;
  v = o;
}
void Ntt(int *t, int opt, int len) {
  int g = 3, g_ = ksm(3, mod - 2);
  for (int i = 0; i < len; i++)
    if (i < rnk[i]) swap(t[i], t[rnk[i]]);
  for (int i = 1; i < len; i <<= 1) {
    int wn = ksm(~opt ? g : g_, (mod - 1) / (i << 1));
    for (int j = 0, J = i << 1; j < len; j += J) {
      int w = 1;
      for (int k = j; k < i + j; k++, w = 1ll * w * wn % mod) {
        int r = 1ll * t[i + k] * w % mod;
        t[i + k] = (t[k] - r + mod) % mod;
        t[k] = (t[k] + r) % mod;
      }
    }
  }
  if (~opt) return;
  int ny = ksm(len, mod - 2);
  for (int i = 0; i < len; i++) t[i] = 1ll * t[i] * ny % mod;
}
void Inv(int Len, int *a, int *b) {
  if (Len == 1) {
    b[0] = ksm(a[0], mod - 2);
    return;
  }
  Inv((Len + 1) >> 1, a, b);
  int len = 1, _2 = -1;
  while (len < Len + Len) len <<= 1, _2++;
  for (int i = 0; i < len; i++) rnk[i] = (rnk[i >> 1] >> 1) | ((i & 1) << _2);
  for (int i = 0; i < Len; i++) d[i] = a[i];
  for (int i = Len; i < len; i++) d[i] = 0;
  Ntt(d, 1, len);
  Ntt(b, 1, len);
  for (int i = 0; i < len; i++)
    b[i] = 1ll * (2 - 1ll * d[i] * b[i] % mod + mod) * b[i] % mod;
  Ntt(b, -1, len);
  for (int i = Len; i < len; i++) b[i] = 0;
}
void Sqr(int Len, int *a, int *b) {
  if (Len == 1) {
    b[0] = 1;
    return;
  }
  Sqr((Len + 1) >> 1, a, b);
  int len = 1, _2 = -1;
  while (len < Len + Len) len <<= 1, _2++;
  for (int i = 0; i < len; i++) e[i] = 0;
  Inv(Len, b, e);
  for (int i = 0; i < len; i++) rnk[i] = (rnk[i >> 1] >> 1) | ((i & 1) << _2);
  for (int i = 0; i < Len; i++) f[i] = a[i];
  for (int i = Len; i < len; i++) f[i] = 0;
  Ntt(e, 1, len);
  Ntt(f, 1, len);
  for (int i = 0; i < len; i++) e[i] = 1ll * e[i] * f[i] % mod;
  Ntt(e, -1, len);
  for (int i = 0; i < Len; i++) b[i] = 1ll * (b[i] + e[i]) * INV % mod;
  for (int i = Len; i < len; i++) b[i] = 0;
}
int main() {
  scanf("%d%d", &n, &m);
  m++;
  INV = ksm(2, mod - 2);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    if (x < m) c[x]++;
  }
  for (int i = 0; i < m; i++) c[i] = (mod - (c[i] << 2)) % mod;
  c[0] = (c[0] + 1) % mod;
  Sqr(m, c, C);
  C[0] = (C[0] + 1) % mod;
  Inv(m, C, g);
  for (int i = 1; i < m; i++) printf("%d\n", (g[i] << 1) % mod);
}