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 P = 998244353, G = 3, inv2 = (P >> 1) | 1, MAXL = 1 << (20);
inline int add(int a, int b) {
  a += b;
  if (a >= P) {
    a -= P;
  }
  return a;
}
int fpow(int a, int k) {
  long long int r = 1LL;
  while (k) {
    if (k & 1) r = r * a % P;
    k >>= 1;
    if (k) a = (1LL * a * a) % P;
  }
  return int(r);
}
void NTT(int *a, int N, int dir) {
  int t = 0;
  for (int i = (0); i <= (N - 1); ++i) {
    if (t < i) swap(a[t], a[i]);
    for (int j = (N >> 1); (t ^= j) < j; j >>= 1)
      ;
  }
  for (int i = 2; i <= N; i <<= 1) {
    int wn = fpow(G, (P - 1) / i);
    for (int j = 0; j < N; j += i) {
      int w = 1;
      for (int k = 0; k < (i >> 1); k++, w = (1LL * w * wn % P)) {
        t = (1LL * w * a[j + k + (i >> 1)]) % P;
        a[j + k + (i >> 1)] = a[j + k] - t;
        a[j + k] = a[j + k] + t;
        if (a[j + k + (i >> 1)] < 0ll) a[j + k + (i >> 1)] += P;
        if (a[j + k] >= P) a[j + k] -= P;
      }
    }
  }
  if (dir == -1) {
    for (int i = (1); i <= ((N >> 1) - 1); ++i) swap(a[i], a[N - i]);
    int IN = fpow(N, P - 2);
    for (int i = (0); i <= (N - 1); ++i) a[i] = (1LL * a[i] * IN) % P;
  }
}
int N, M, L = 4;
void conv(int *a, int *b, int *c, int l) {
  NTT(a, 2 * l, 1);
  NTT(b, 2 * l, 1);
  for (int i = (0); i <= (2 * l - 1); ++i) c[i] = (1LL * a[i] * b[i]) % P;
  NTT(c, 2 * l, -1);
  for (int i = (l); i <= (2 * l - 1); ++i) c[i] = 0;
}
int C[2 * MAXL], R[2 * MAXL], II[2 * MAXL], tmp[2 * MAXL], tmp1[2 * MAXL],
    IA[2 * MAXL];
void INV(int *A, int *Pl, int SZ) {
  A[0] = 1;
  A[1] = 0;
  for (int m = 2; m <= SZ; m <<= 1) {
    for (int i = (0); i <= (m - 1); ++i) tmp[i] = Pl[i];
    for (int i = (m); i <= (2 * m - 1); ++i) tmp[i] = A[i] = 0;
    NTT(tmp, 2 * m, 1);
    NTT(A, 2 * m, 1);
    for (int i = (0); i <= (2 * m - 1); ++i)
      A[i] = 1LL * A[i] * (2LL - 1LL * tmp[i] * A[i] % P + P) % P;
    NTT(A, 2 * m, -1);
    for (int i = (m); i <= (2 * m - 1); ++i) A[i] = 0;
  }
}
void SQRT(int *A, int *Pl, int SZ) {
  A[0] = 1;
  A[1] = 0;
  for (int m = 2; m <= SZ; m <<= 1) {
    for (int i = (0); i <= (m - 1); ++i) tmp1[i] = Pl[i];
    for (int i = (m); i <= (2 * m - 1); ++i) tmp1[i] = A[i] = 0;
    NTT(tmp1, 2 * m, 1);
    INV(IA, A, m);
    NTT(IA, 2 * m, 1);
    NTT(A, 2 * m, 1);
    for (int i = (0); i <= (2 * m - 1); ++i)
      A[i] = (1LL * inv2 * A[i] + 1LL * inv2 * tmp1[i] % P * IA[i]) % P;
    NTT(A, 2 * m, -1);
    for (int i = (m); i <= (2 * m - 1); ++i) A[i] = 0;
  }
}
void gn(int &x) {
  char c;
  while ((c = getchar()) < '0' || c > '9')
    ;
  x = c - '0';
  while ((c = getchar()) >= '0' && c <= '9') x = x * 10 + c - '0';
}
int main() {
  gn(N);
  gn(M);
  vector<int> a(N, 0);
  int mx = 0;
  for (int i = (0); i <= (N - 1); ++i) {
    gn(a[i]);
    mx = max(a[i], mx);
  }
  while (L <= mx || L <= M) L <<= 1;
  for (int i = (0); i <= (N - 1); ++i) C[a[i]] = P - 4;
  C[0] = 1;
  R[0] = 1;
  SQRT(R, C, L);
  ++R[0];
  for (int i = (0); i <= (2 * L - 1); ++i) R[i] = (1LL * R[i] * inv2) % P;
  II[0] = 1;
  INV(II, R, L);
  for (int i = (1); i <= (M); ++i) printf("%d\n", II[i]);
  return 0;
}