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, G = 3, inv2 = 499122177;
long long w[400005], wn;
int wlen, r[400005];
inline long long ksm(long long a, int b) {
  long long s = 1;
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1) s = s * a % mod;
  return s;
}
inline void init(int n) {
  wlen = w[0] = 1;
  while (wlen < n << 1) wlen <<= 1;
  wn = ksm(G, (mod - 1) / wlen);
  for (int i = 1; i <= wlen; i++) w[i] = w[i - 1] * wn % mod;
}
inline void getrev(int len) {
  for (int i = 0; i < len; i++)
    r[i] = (r[i >> 1] >> 1) | (i & 1 ? len >> 1 : 0);
}
inline void ntt(long long *a, int len, int flg) {
  for (int i = 0; i < len; i++)
    if (i < r[i]) swap(a[i], a[r[i]]);
  for (int i = 2; i <= len; i <<= 1)
    for (int j = 0, t = wlen / i; j < len; j += i)
      for (int k = j, o = 0; k < j + i / 2; k++, o += t) {
        long long u = a[k],
                  v = (flg == 1 ? w[o] : w[wlen - o]) * a[k + i / 2] % mod;
        a[k] = (u + v) % mod, a[k + i / 2] = (u - v + mod) % mod;
      }
  if (flg == -1) {
    long long ni = ksm(len, mod - 2);
    for (int i = 0; i < len; i++) a[i] = a[i] * ni % mod;
  }
}
long long a[400005], b[400005], A[400005], B[400005], C[400005], D[400005];
void poly_inv(long long *a, long long *b, int n) {
  b[0] = ksm(a[0], mod - 2), b[1] = 0;
  int len, lim;
  for (len = 2; len < (n << 1); len <<= 1) {
    lim = len << 1;
    copy(a, a + len, A), copy(b, b + len, B);
    getrev(lim), ntt(A, lim, 1), ntt(B, lim, 1);
    for (int i = 0; i < lim; i++)
      b[i] = ((2 - B[i] * A[i] % mod) * B[i] % mod + mod) % mod;
    ntt(b, lim, -1);
    fill(b + len, b + lim, 0);
  }
  fill(A, A + len, 0), fill(B, B + len, 0), fill(b + n, b + len, 0);
}
void poly_sqrt(long long *a, long long *b, int n) {
  b[0] = 1, b[1] = 0;
  long long *A = C, *B = D;
  int len, lim;
  for (len = 2; len < (n << 1); len <<= 1) {
    lim = len << 1;
    copy(a, a + len, A), poly_inv(b, B, len);
    getrev(lim), ntt(A, lim, 1), ntt(B, lim, 1);
    for (int i = 0; i < lim; i++) A[i] = A[i] * B[i] % mod;
    ntt(A, lim, -1);
    for (int i = 0; i < len; i++) b[i] = (b[i] + A[i]) * inv2 % mod;
    fill(b + len, b + lim, 0);
  }
  fill(A, A + len, 0), fill(B, B + len, 0), fill(b + n, b + len, 0);
}
int n, m, ans;
int main() {
  scanf("%d%d", &n, &m);
  init(m + 1);
  for (int i = 0, x; i < n; i++) {
    scanf("%d", &x);
    if (x <= m) a[x] -= 4;
  }
  a[0] += 1;
  poly_sqrt(a, b, m + 1);
  b[0] += 1;
  poly_inv(b, a, m + 1);
  for (int i = 1; i <= m; i++) printf("%d\n", (a[i] + mod) * 2ll % mod);
}