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 double pi = acos(-1);
const int mo = 998244353;
int W[2][(1 << 18) + 10], pos[22][(1 << 18) + 10], tmp[(1 << 18) + 10],
    c[(1 << 18) + 10];
int n, m;
int Pow(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = 1ll * x * res % mo;
    x = 1ll * x * x % mo;
    y /= 2;
  }
  return res;
}
void prep() {
  int g = 3, x = 1;
  g = Pow(g, (mo - 1) / (1 << 18));
  for (int i = 0; i <= (1 << 18) - 1; ++i) {
    W[0][i] = x;
    x = 1ll * x * g % mo;
  }
  for (int i = 0; i <= (1 << 18) - 1; ++i)
    W[1][i] = W[0][((1 << 18) - i) % (1 << 18)];
  for (int i = 0; i <= 18; ++i)
    for (int j = 0; j <= (1 << i) - 1; ++j) {
      int x = 0;
      for (int k = 0; k <= i - 1; ++k)
        if ((j >> k) & 1) x |= 1 << i - 1 - k;
      pos[i][j] = x;
    }
}
void DFT(int *a, int flag, int s, int cnt) {
  for (int i = 0; i <= s - 1; ++i)
    if (pos[cnt][i] > i) swap(a[i], a[pos[cnt][i]]);
  for (int i = 1; i < s; i <<= 1)
    for (int j = 0; j < s; j += i << 1)
      for (int k = 0; k < i; ++k) {
        int u = a[j + k],
            v = 1ll * a[j + k + i] * W[flag][k * ((1 << 18) / i / 2)] % mo;
        a[j + k] = (u + v) % mo;
        a[j + k + i] = (u - v + mo) % mo;
      }
  if (flag) {
    int ni = Pow(s, mo - 2);
    for (int i = 0; i <= s - 1; ++i) a[i] = 1ll * a[i] * ni % mo;
  }
}
void NTT(int *p1, int l1, int *p2, int l2, int *a) {
  int maxx = max(l1, l2), s = 1, cnt = 0;
  static int b[(1 << 18) + 10];
  while (s < maxx) s <<= 1, cnt++;
  s <<= 1;
  cnt++;
  for (int i = 0; i < s; ++i) {
    if (i < l2)
      b[i] = *(p2 + i);
    else
      b[i] = 0;
  }
  for (int i = 0; i < s; ++i) {
    if (i < l1)
      a[i] = *(p1 + i);
    else
      a[i] = 0;
  }
  DFT(a, 0, s, cnt);
  DFT(b, 0, s, cnt);
  for (int i = 0; i <= s - 1; ++i) a[i] = 1ll * a[i] * b[i] % mo;
  DFT(a, 1, s, cnt);
}
void Inv(int *f, int n, int *a) {
  int s = 1;
  static int tmp[(1 << 18) + 10];
  a[0] = Pow(f[0], mo - 2);
  while (s < n) {
    NTT(a, s, a, s, tmp);
    NTT(tmp, 2 * s, f, 2 * s, tmp);
    for (int i = 0; i <= 2 * s - 1; ++i)
      a[i] = (2ll * (i < s ? a[i] : 0) - tmp[i] + mo) % mo;
    s *= 2;
  }
}
void Sqrt(int *f, int n, int *a) {
  int s = 1, inv2 = Pow(2, mo - 2);
  static int tmp[(1 << 18) + 10] = {0};
  assert(f[0] == 1);
  a[0] = 1;
  while (s < n) {
    Inv(a, s * 2, tmp);
    NTT(tmp, s * 2, f, s * 2, tmp);
    for (int i = 0; i <= 2 * s - 1; ++i)
      a[i] = 1ll * ((i < s ? a[i] : 0) + tmp[i]) * inv2 % mo;
    s *= 2;
  }
}
int main() {
  prep();
  scanf("%d%d", &n, &m);
  int x;
  for (int i = 1; i <= n; ++i) scanf("%d", &x), c[x] = 1;
  for (int i = 1; i <= m; ++i) c[i] = (-4ll * c[i] % mo + mo) % mo;
  c[0] = 1;
  Sqrt(c, m + 1, tmp);
  tmp[0]++;
  for (int i = 0; i <= m; ++i) tmp[i] = 1ll * tmp[i] * (mo + 1) / 2 % mo;
  Inv(tmp, m + 1, c);
  for (int i = 1; i <= m; ++i) printf("%d\n", c[i]);
}