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 N = 270005, mod = 998244353, inv2 = 499122177;
int n, m, len, x, inv[N], a[N], rev[N], w[20][N], iw[20][N];
inline int add(int a, int b) {
  a += b;
  return a < mod ? a : a - mod;
}
inline int dec(int a, int b) {
  a -= b;
  return a < 0 ? a + mod : a;
}
inline int mul(int a, int b) { return 1LL * a * b % mod; }
int fastpow(int a, int x) {
  int res = 1;
  while (x) {
    if (x & 1) {
      res = mul(res, a);
    }
    x >>= 1;
    a = mul(a, a);
  }
  return res;
}
void init(int len) {
  inv[1] = 1;
  for (int i = 2; i <= len; i++) {
    inv[i] = mul(inv[mod % i], dec(mod, mod / i));
  }
  for (int i = 1, t = 0; i < len; i <<= 1, t++) {
    int wn = fastpow(3, (mod - 1) / i / 2), iwn = fastpow(wn, mod - 2);
    for (int j = 0; j < len; j += (i << 1)) {
      int w = 1, iw = 1;
      for (int k = j; k < j + i; k++, w = mul(w, wn), iw = mul(iw, iwn)) {
        ::w[t][k] = w;
        ::iw[t][k] = iw;
      }
    }
  }
}
void ntt(int a[], int len) {
  for (int i = 0; i < len; i++) {
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (len >> 1));
    if (i < rev[i]) {
      swap(a[i], a[rev[i]]);
    }
  }
  for (int i = 1, t = 0; i < len; i <<= 1, t++) {
    for (int j = 0; j < len; j += (i << 1)) {
      int x, y;
      for (int k = j; k < j + i; k++) {
        x = a[k];
        y = mul(w[t][k], a[k + i]);
        a[k] = add(x, y);
        a[k + i] = dec(x, y);
      }
    }
  }
}
void intt(int a[], int len) {
  for (int i = 0; i < len; i++) {
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (len >> 1));
    if (i < rev[i]) {
      swap(a[i], a[rev[i]]);
    }
  }
  for (int i = 1, t = 0; i < len; i <<= 1, t++) {
    for (int j = 0; j < len; j += (i << 1)) {
      int x, y;
      for (int k = j; k < j + i; k++) {
        x = a[k];
        y = mul(iw[t][k], a[k + i]);
        a[k] = add(x, y);
        a[k + i] = dec(x, y);
      }
    }
  }
  for (int i = 0; i < len; i++) {
    a[i] = mul(a[i], inv[len]);
  }
}
void getinv(int a[], int res[], int len) {
  static int b[N], c[N], d[N];
  for (int i = 0; i < (len << 1); i++) {
    b[i] = c[i] = d[i] = 0;
  }
  b[0] = fastpow(a[0], mod - 2);
  for (int i = 2; i <= len; i <<= 1) {
    for (int j = 0; j < i; j++) {
      c[j] = b[j];
      d[j] = a[j];
    }
    ntt(c, i << 1);
    ntt(d, i << 1);
    for (int j = 0; j < (i << 1); j++) {
      c[j] = mul(c[j], dec(2, mul(c[j], d[j])));
    }
    intt(c, i << 1);
    for (int j = 0; j < i; j++) {
      b[j] = c[j];
    }
  }
  for (int i = 0; i < len; i++) {
    res[i] = b[i];
  }
}
int bsgs(int a, int b) {
  static map<int, int> mp;
  mp.clear();
  int p = ceil(sqrt(mod)), s = 1;
  for (int i = 0; i < p; i++, s = mul(s, a)) {
    mp[s] = i;
  }
  s = fastpow(s, mod - 2);
  for (int i = 0, j = b; i < mod; i += p, j = mul(j, s)) {
    if (mp.count(j)) {
      return i + mp[j];
    }
  }
  return 0;
}
void getsqrt(int a[], int res[], int len) {
  static int b[N], c[N], d[N];
  for (int i = 0; i < (len << 1); i++) {
    b[i] = c[i] = d[i] = 0;
  }
  int tmp = fastpow(3, bsgs(3, a[0]) >> 1);
  tmp = min(tmp, mod - tmp);
  b[0] = tmp;
  for (int i = 2; i <= len; i <<= 1) {
    for (int j = 0; j < i; j++) {
      c[j] = add(b[j], b[j]);
      d[j] = a[j];
    }
    getinv(c, c, i);
    ntt(c, i << 1);
    ntt(d, i << 1);
    for (int j = 0; j < (i << 1); j++) {
      c[j] = mul(c[j], d[j]);
    }
    intt(c, i << 1);
    for (int j = 0; j < i; j++) {
      b[j] = add(mul(b[j], inv2), c[j]);
    }
  }
  for (int i = 0; i < len; i++) {
    res[i] = b[i];
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (len = 1; len <= m; len <<= 1)
    ;
  init(len << 1);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    a[x] = mod - 4;
  }
  a[0] = 1;
  getsqrt(a, a, len);
  a[0] = add(a[0], 1);
  getinv(a, a, len);
  for (int i = 1; i <= m; i++) {
    printf("%d\n", add(a[i], a[i]));
  }
  return 0;
}