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, Gi = 332748118;
int T, n, m, k, q;
int a[400010], b[400010], c[400010], d[400010], e[400010], f[400010], g[400010],
    h[400010], rev[400010];
int ksm(int a, int k) {
  int ans = 1;
  for (; k; k >>= 1, a = 1ll * a * a % mod)
    if (k & 1) ans = 1ll * a * ans % mod;
  return ans;
}
void NTT(int *now, int lim, int type) {
  for (int i = 0; i < lim; i++)
    if (i < rev[i]) swap(now[i], now[rev[i]]);
  for (int mid = 1; mid < lim; mid <<= 1) {
    int Wn = ksm(type == 1 ? G : Gi, (mod - 1) / (mid << 1));
    for (int j = 0; j < lim; j += (mid << 1)) {
      int w = 1;
      for (int k = 0; k < mid; k++, w = 1ll * w * Wn % mod) {
        int x = now[j + k], y = 1ll * w * now[mid + j + k] % mod;
        now[j + k] = (x + y) % mod;
        now[mid + j + k] = (x - y + mod) % mod;
      }
    }
  }
  if (type > 0) return;
  int inv = ksm(lim, mod - 2);
  for (int i = 0; i < lim; i++) now[i] = 1ll * now[i] * inv % mod;
}
void Inv(int dep, int *A, int *B) {
  for (int i = 0; i < dep; i++) B[i] = 0;
  if (dep == 1) {
    B[0] = ksm(A[0], mod - 2);
    return;
  }
  Inv((dep + 1) >> 1, A, B);
  int len = 0, lim = 1;
  while (lim < (dep << 1)) lim <<= 1, len++;
  for (int i = 1; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  for (int i = dep; i < lim; i++) c[i] = 0;
  for (int i = 0; i < dep; i++) c[i] = A[i];
  NTT(c, lim, 1);
  NTT(B, lim, 1);
  for (int i = 0; i < lim; i++) {
    B[i] = (2 - 1ll * c[i] * B[i] % mod + mod) * B[i] % mod;
  }
  NTT(B, lim, -1);
  for (int i = 0; i < lim; i++) c[i] = 0;
  for (int i = dep; i < lim; i++) B[i] = 0;
}
void Dev(int dep, int *A, int *B) {
  for (int i = 0; i < dep; i++) B[i] = A[i + 1] * (i + 1ll) % mod;
  B[dep - 1] = 0;
}
void invDev(int dep, int *A, int *B) {
  for (int i = 1; i < dep; i++) B[i] = 1ll * A[i - 1] * ksm(i, mod - 2) % mod;
  B[0] = 0;
}
void Ln(int dep, int *A, int *B) {
  Dev(dep, A, d);
  Inv(dep, A, B);
  int len = 0, lim = 1;
  while (lim < (dep << 1)) lim <<= 1, len++;
  for (int i = 1; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  for (int i = dep; i < lim; i++) d[i] = B[i] = 0;
  NTT(d, lim, 1), NTT(B, lim, 1);
  for (int i = 0; i < lim; i++) c[i] = 1ll * d[i] * B[i] % mod;
  NTT(c, lim, -1);
  invDev(dep, c, B);
  for (int i = 0; i < lim; i++) d[i] = c[i] = 0;
  for (int i = dep; i < lim; i++) B[i] = 0;
}
void w_Exp(int lim, int *A, int *B) {
  if (lim == 1) {
    B[0] = 1;
    return;
  }
  w_Exp(lim >> 1, A, B);
  Ln(lim, B, f);
  f[0] = (A[0] + 1 - f[0] + mod) % mod;
  for (int i = 1; i < lim; i++) f[i] = (A[i] - f[i] + mod) % mod;
  for (int i = 1; i < (lim << 1); i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) ? lim : 0);
  NTT(B, lim << 1, 1);
  NTT(f, lim << 1, 1);
  for (int i = 0; i < (lim << 1); i++) B[i] = 1ll * B[i] * f[i] % mod;
  NTT(B, lim << 1, -1);
  for (int i = lim; i < (lim << 1); i++) B[i] = 0, f[i] = 0;
}
void Exp(int dep, int *A, int *B) {
  int lim = 1;
  while (lim < dep) lim <<= 1;
  for (int i = 0; i < lim; i++) B[i] = 0;
  w_Exp(lim, A, B);
  for (int i = dep; i < lim; i++) B[i] = 0;
}
void ksm(int dep, int k, int *A, int *B) {
  for (int i = 0; i < dep; i++) e[i] = 0;
  int low = 0;
  for (int i = 0; i < dep; i++)
    if (A[i]) {
      low = i;
      break;
    }
  for (int i = 0; i < dep; i++) A[i] = A[i + low];
  for (int i = dep - low; i < dep; i++) A[i] = 0;
  int inv_a0 = ksm(A[0], mod - 2), k_a0 = ksm(A[0], k);
  for (int i = 0; i < dep; i++) A[i] = 1ll * inv_a0 * A[i] % mod;
  Ln(dep, A, e);
  for (int i = 0; i < dep; i++) A[i] = 1ll * e[i] * k % mod;
  B[0] = ksm(A[0], k);
  Exp(dep, A, B);
  for (int i = 0; i < dep; i++) B[i] = 1ll * B[i] * k_a0 % mod;
  if (1ll * low * k >= dep)
    for (int i = 0; i < dep; i++) B[i] = 0;
  else {
    for (int i = dep - 1; i >= low * k; i--) B[i] = B[i - low * k];
    for (int i = low * k - 1; i >= 0; i--) B[i] = 0;
  }
}
int main() {
  scanf("%d %d", &n, &m);
  m++;
  for (int i = 1, w; i <= n; i++) {
    scanf("%d", &w);
    if (w <= m) g[w]++;
  }
  for (int i = 0; i < m; i++) g[i] = (-4ll * g[i] % mod + mod) % mod;
  g[0] = (g[0] + 1) % mod;
  ksm(m, ksm(2, mod - 2), g, h);
  h[0] = (h[0] + 1) % mod;
  Inv(m, h, g);
  for (int i = 1; i < m; i++) g[i] = 2ll * g[i] % mod;
  for (int i = 1; i < m; i++) printf("%d\n", g[i]);
}