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 mod = 998244353, ge = 3;
long long n, m, mx, lim, l, a[800050], b[800050], c[800050], d[800050],
    e[800050], qwq[800050], qaq[800050], r[800050];
long long ksm(long long qaq, long long f) {
  long long res = 1;
  while (f) {
    if (f & 1) {
      res = res * qaq % mod;
    }
    qaq = qaq * qaq % mod;
    f >>= 1;
  }
  return res;
}
void NTT(long long *x, long long flag) {
  for (long long i = 0; i < lim; i++) {
    if (i < r[i]) {
      swap(x[i], x[r[i]]);
    }
  }
  for (long long mid = 1; mid < lim; mid <<= 1) {
    long long wn = ksm(ge, flag == 1 ? (mod - 1) / (mid << 1)
                                     : (mod - 1 - (mod - 1) / (mid << 1)));
    for (long long r = (mid << 1), i = 0; i < lim; i += r) {
      long long w = 1;
      for (long long k = 0; k < mid; k++, w = w * wn % mod) {
        long long m1 = x[i + k], m2 = w * x[i + mid + k] % mod;
        x[i + k] = (m1 + m2) % mod, x[i + mid + k] = (m1 - m2 + mod) % mod;
      }
    }
  }
}
void getinv(long long *f, long long *g, long long len) {
  if (len == 1) {
    g[0] = ksm(f[0], mod - 2);
    return;
  }
  getinv(f, g, len + 1 >> 1);
  lim = 1, l = 0;
  while (lim < (len << 1)) {
    lim <<= 1;
    l++;
  }
  for (long long i = 1; i < lim; i++) {
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  }
  for (long long i = 0; i < len; i++) {
    c[i] = f[i];
  }
  for (long long i = len; i < lim; i++) {
    c[i] = 0;
  }
  NTT(c, 1), NTT(g, 1);
  for (long long i = 0; i < lim; i++) {
    g[i] = ((2ll - g[i] * c[i] % mod) + mod) % mod * g[i] % mod;
  }
  NTT(g, -1);
  long long ny = ksm(lim, mod - 2);
  for (long long i = 0; i < len; i++) {
    g[i] = g[i] * ny % mod;
  }
  for (long long i = len; i < lim; i++) {
    g[i] = 0;
  }
}
void getsqrt(long long *f, long long *g, long long len) {
  if (len == 1) {
    g[0] = 1;
    return;
  }
  getsqrt(f, g, (len + 1) >> 1);
  lim = 1, l = 0;
  while (lim < (len << 1)) {
    lim <<= 1, l++;
  }
  for (long long i = 1; i < lim; i++) {
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  }
  for (long long i = 0; i < len; i++) {
    d[i] = 2 * g[i] % mod;
  }
  for (long long i = len; i < lim; i++) {
    d[i] = 0;
  }
  long long ny = ksm(lim, mod - 2);
  getinv(d, e, len);
  NTT(g, 1);
  for (long long i = 0; i < lim; i++) {
    g[i] = g[i] * g[i] % mod;
  }
  NTT(g, 0);
  for (long long i = 0; i < len; i++) {
    g[i] = (g[i] * ny + f[i]) % mod;
  }
  for (long long i = len; i < lim; i++) {
    g[i] = 0;
  }
  NTT(g, 1), NTT(e, 1);
  for (long long i = 0; i < lim; i++) {
    g[i] = g[i] * e[i] % mod;
  }
  NTT(g, 0);
  for (long long i = 0; i < lim; i++) {
    g[i] = g[i] * ny % mod;
  }
  memset(e, 0, sizeof(e)), memset(d, 0, sizeof(d));
  for (long long i = len; i < lim; i++) {
    g[i] = 0;
  }
}
signed main() {
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    long long x;
    scanf("%lld", &x);
    qwq[x] = 1;
    qwq[x] = (-4 * qwq[x] + mod) % mod;
  }
  qwq[0] = 1;
  n = 1;
  while (n < (m << 1)) {
    n <<= 1;
  }
  getsqrt(qwq, qaq, n);
  qaq[0]++;
  memset(qwq, 0, sizeof(qwq));
  getinv(qaq, qwq, n);
  for (long long i = 1; i <= m; i++) {
    printf("%lld ", qwq[i] * 2 % mod);
  }
}