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;
int tot;
long long xx[400005][2], w[400005], f[400005], g[400005];
int P = ((7 * 17) << 23) + 1;
int pw(long long x, int k) {
  int t = 1;
  long long ans = 1;
  while (t <= k) {
    if (k & t) ans = ans * x % P;
    t <<= 1;
    x = x * x % P;
  }
  return ans;
}
long long _cof[10][400005];
int rev_map[1 << 18];
struct poly {
  int deg;
  long long *cof;
  poly() { cof = _cof[tot++]; }
  poly(int cnst) {
    cof = _cof[tot++];
    deg = 0;
    cof[0] = cnst;
  }
  void clear() {
    for (int i = 0; i <= deg; i++) cof[i] = 0;
  }
  void updeg(int x) {
    for (int i = deg + 1; i <= x; i++) cof[i] = 0;
    deg = x;
  }
  void operator+=(const poly *F) {
    if (deg < F->deg) updeg(F->deg);
    for (int i = 0; i <= deg; i++)
      cof[i] = (cof[i] + (i <= F->deg ? F->cof[i] : 0) + P) % P;
  }
  void operator-=(const poly *F) {
    if (deg < F->deg) updeg(F->deg);
    for (int i = 0; i <= deg; i++)
      cof[i] = (cof[i] - (i <= F->deg ? F->cof[i] : 0) + P) % P;
  }
  void init(int r) {
    for (int i = 0; i < 1 << r; i++) {
      int p = 0;
      for (int j = 0; j < r; j++) p += ((i & (1 << j)) >> j) << (r - 1 - j);
      rev_map[i] = p;
    }
    int g = 3;
    w[0] = 1;
    w[1] = pw(g, (7 * 17) << (23 - r));
    for (int i = 2; i < 1 << r; i++) w[i] = ((long long)w[i - 1] * w[1]) % P;
  }
  void dft(long long *x, int r) {
    for (int i = 0; i < 1 << r; i++) xx[i][0] = x[rev_map[i]];
    int now = 0;
    for (int dlt = 0; dlt < r; dlt++) {
      for (int j = 0; j < 1 << (r - dlt - 1); j++)
        for (int i = 0; i < 1 << dlt; i++) {
          int p1 = (j << (dlt + 1)) + i;
          int p2 = p1 + (1 << dlt);
          long long tmp = xx[p2][now] * w[i << (r - dlt - 1)] % P;
          xx[p1][now ^ 1] = (xx[p1][now] + tmp + P) % P;
          xx[p2][now ^ 1] = (xx[p1][now] - tmp + P) % P;
        }
      now ^= 1;
    }
    for (int i = 0; i < 1 << r; i++) x[i] = xx[i][now];
  }
  void operator*=(const int x) {
    if (x > 0)
      for (int i = 0; i <= deg; i++) cof[i] = (cof[i] * x) % P;
    else
      for (int i = 0; i <= deg; i++) cof[i] = ((cof[i] - P) * x) % P;
  }
  void operator+=(const int x) { cof[0] = (cof[0] + x + P) % P; }
  void operator/=(const int x) {
    long long tmp = pw(x, P - 2);
    if (x > 0)
      for (int i = 0; i <= deg; i++) cof[i] = (cof[i] * tmp) % P;
    else {
    }
  }
  void operator*=(const poly *F) {
    int r = 0;
    while ((1 << r) <= F->deg + deg) r++;
    for (int i = deg + 1; i < 1 << r; i++) cof[i] = 0;
    for (int i = 0; i <= F->deg; i++) f[i] = F->cof[i];
    for (int i = F->deg + 1; i < 1 << r; i++) f[i] = 0;
    init(r);
    dft(cof, r);
    dft(f, r);
    for (int i = 0; i < 1 << r; i++) cof[i] = (cof[i] * f[i]) % P;
    dft(cof, r);
    for (int i = 1; i < 1 << (r - 1); i++) swap(cof[i], cof[(1 << r) - i]);
    long long tmp = pw(1 << r, P - 2);
    for (int i = 0; i < 1 << r; i++) cof[i] = cof[i] * tmp % P;
    deg = F->deg + deg;
  }
  void inv(int ans_deg) {
    int cnt = 0, _deg[100];
    for (int i = ans_deg; i != 0; i /= 2) _deg[++cnt] = i;
    _deg[++cnt] = 0;
    f[0] = 1 / cof[0];
    for (int p = cnt - 1; p >= 1; p--) {
      int r = 0;
      while ((1 << r) <= 2 * _deg[p + 1] + _deg[p]) r++;
      for (int i = _deg[p + 1] + 1; i < 1 << r; i++) f[i] = 0;
      for (int i = 0; i <= _deg[p]; i++) g[i] = cof[i];
      for (int i = _deg[p] + 1; i < 1 << r; i++) g[i] = 0;
      init(r);
      dft(f, r);
      dft(g, r);
      for (int i = 0; i < 1 << r; i++)
        f[i] = f[i] * (2 - f[i] * g[i] % P + P) % P;
      dft(f, r);
      for (int i = 1; i < 1 << (r - 1); i++) swap(f[i], f[(1 << r) - i]);
      long long tmp = pw(1 << r, P - 2);
      for (int i = 0; i < 1 << r; i++) f[i] = f[i] * tmp % P;
      for (int i = 1 << r; i <= _deg[p]; i++) f[i] = 0;
    }
    deg = ans_deg;
    for (int i = 0; i <= deg; i++) cof[i] = f[i];
  }
  void p_sqrt(int ans_deg);
} tmp, A, M;
void cpy(poly *A, poly *B) {
  A->deg = B->deg;
  for (int i = 0; i <= A->deg; i++) A->cof[i] = B->cof[i];
}
void poly::p_sqrt(int ans_deg) {
  int cnt = 0, _deg[100];
  for (int i = ans_deg; i != 0; i /= 2) _deg[++cnt] = i;
  _deg[++cnt] = 0;
  tmp.deg = 0;
  tmp.cof[0] = (int)(sqrt(cof[0]) + 1e-10);
  for (int i = cnt - 1; i >= 1; i--) {
    cpy(&A, &tmp);
    A.inv(_deg[i]);
    cpy(&M, &*this);
    M.deg = _deg[i];
    M *= &A;
    tmp += &M;
    for (int j = tmp.deg + 1; j <= _deg[i]; j++) tmp.cof[j] = 0;
    long long tp = pw(2, P - 2);
    for (int j = 0; j <= _deg[i]; j++) tmp.cof[j] = tmp.cof[j] * tp % P;
  }
  cpy(&*this, &tmp);
}
int main() {
  poly C;
  int n, m, c;
  C.deg = 100000;
  C.clear();
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &c);
    C.cof[c] += 1;
  }
  C *= -4;
  C += 1;
  C.p_sqrt(m);
  C += 1;
  C /= 2;
  C.inv(m);
  for (int i = 1; i <= m; i++) printf("%d\n", (int)C.cof[i]);
}