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;
inline int read() {
  char ch = getchar();
  int res = 0, f = 1;
  while (!isdigit(ch)) f ^= ch == '-', ch = getchar();
  while (isdigit(ch)) res = (res + (res << 2) << 1) + (ch ^ 48), ch = getchar();
  return f ? res : -res;
}
const int mod = 998244353, G = 3;
inline int add(int a, int b) { return (a += b) >= mod ? a - mod : a; }
inline void Add(int &a, int b) { (a += b) >= mod ? (a -= mod) : 0; }
inline int dec(int a, int b) { return (a -= b) < 0 ? a + mod : a; }
inline void Dec(int &a, int b) { (a -= b) < 0 ? (a += mod) : 0; }
inline int mul(int a, int b) {
  return 1ll * a * b >= mod ? 1ll * a * b % mod : a * b;
}
inline void Mul(int &a, int b) { a = mul(a, b); }
inline int ksm(int a, int b, int res = 1) {
  for (; b; b >>= 1, a = mul(a, a)) (b & 1) && (res = mul(res, a));
  return res;
}
inline void chemx(long long &a, long long b) { a < b ? a = b : 0; }
inline void chemn(int &a, int b) { a > b ? a = b : 0; }
const int N = (1 << 17) + 1, C = 20;
vector<int> w[C + 1];
int rev[N << 2];
inline void init_w() {
  for (int i = 1; i <= C; i++) w[i].resize(1 << (i - 1));
  int wn = ksm(G, (mod - 1) / (1 << C));
  w[C][0] = 1;
  for (int i = 1; i < (1 << (C - 1)); i++) w[C][i] = mul(w[C][i - 1], wn);
  for (int i = C - 1; i; i--)
    for (int j = 0; j < (1 << (i - 1)); j++) w[i][j] = w[i + 1][j << 1];
}
inline void init_rev(int lim) {
  for (int i = 0; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (lim >> 1));
}
inline void ntt(vector<int> &f, int lim, int kd) {
  for (int i = 0; i < lim; i++)
    if (i > rev[i]) swap(f[i], f[rev[i]]);
  for (int a0, a1, mid = 1, l = 1; mid < lim; mid <<= 1, l++)
    for (int i = 0; i < lim; i += (mid << 1))
      for (int j = 0; j < mid; j++)
        a0 = f[i + j], a1 = mul(f[i + j + mid], w[l][j]),
        f[i + j] = add(a0, a1), f[i + j + mid] = dec(a0, a1);
  if (kd == -1) {
    reverse(f.begin() + 1, f.begin() + lim);
    for (int i = 0, inv = ksm(lim, mod - 2); i < lim; i++) Mul(f[i], inv);
  }
}
inline vector<int> operator*(vector<int> a, vector<int> b) {
  int deg = a.size() + b.size() - 1, lim = 1;
  if (deg <= 128) {
    vector<int> c(deg, 0);
    for (int i = 0; i < a.size(); i++)
      for (int j = 0; j < b.size(); j++) Add(c[i + j], mul(a[i], b[j]));
    return c;
  }
  while (lim < deg) lim <<= 1;
  init_rev(lim);
  a.resize(lim), ntt(a, lim, 1);
  b.resize(lim), ntt(b, lim, 1);
  for (int i = 0; i < lim; i++) Mul(a[i], b[i]);
  ntt(a, lim, -1), a.resize(deg);
  return a;
}
inline vector<int> Inv(vector<int> a, int deg) {
  vector<int> b(1, ksm(a[0], mod - 2)), c;
  for (int lim = 4; lim < (deg << 2); lim <<= 1) {
    c = a, c.resize(lim >> 1);
    init_rev(lim);
    b.resize(lim), ntt(b, lim, 1);
    c.resize(lim), ntt(c, lim, 1);
    for (int i = 0; i < lim; i++) Mul(b[i], dec(2, mul(b[i], c[i])));
    ntt(b, lim, -1), b.resize(lim >> 1);
  }
  b.resize(deg);
  return b;
}
inline vector<int> Sqrt(vector<int> a, int deg) {
  vector<int> b(1, 1), c, d;
  int inv2 = ksm(2, mod - 2);
  for (int lim = 4; lim < (deg << 2); lim <<= 1) {
    c = a, c.resize(lim >> 1);
    init_rev(lim), d = Inv(b, lim >> 1), c = c * d, b.resize(lim);
    for (int i = 0; i < lim; i++) b[i] = mul(inv2, add(b[i], c[i]));
  }
  b.resize(deg);
  return b;
}
int n, m;
vector<int> f;
int main() {
  n = read(), m = read();
  f.resize(1e5 + 1), init_w();
  for (int i = 1; i <= n; i++) f[read()] = mod - 4;
  f[0]++;
  f = Sqrt(f, m + 1);
  f[0]++;
  f = Inv(f, m + 1);
  for (int i = 0; i <= m; i++) Mul(f[i], 2);
  for (int i = 1; i <= m; i++) cout << f[i] << '\n';
}