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 pw(int a, int b) {
  int r = 1;
  for (; b; b >>= 1, a = 1ll * a * a % 998244353)
    if (b & 1) r = 1ll * r * a % 998244353;
  return r;
}
inline int add(int a, int b) {
  return a + b >= 998244353 ? a + b - 998244353 : a + b;
}
inline void upd(int& a, int b) {
  a = a + b >= 998244353 ? a + b - 998244353 : a + b;
}
namespace NTT {
const int G = 3;
int n, m, p[262145], poww[262145], w[20];
inline void init(int len) {
  for (n = 1, m = 0; n <= len; n <<= 1, m++)
    ;
  for (int i = 1; i < n; i++) p[i] = (p[i >> 1] >> 1) | ((i & 1) << m - 1);
}
inline void ntt(int* a, bool flag) {
  for (int i = 0; i < n; i++)
    if (i < p[i]) swap(a[i], a[p[i]]);
  w[0] = pw(G, (998244353 - 1) / n);
  if (flag) w[0] = pw(w[0], 998244353 - 2);
  for (int i = 1; i < m; i++) w[i] = 1ll * w[i - 1] * w[i - 1] % 998244353;
  for (int i = 1, x = m - 1; i < n; i <<= 1, x--) {
    poww[0] = 1;
    for (int j = 1; j < i; j++) poww[j] = 1ll * poww[j - 1] * w[x] % 998244353;
    for (int j = 0; j < n; j += i << 1) {
      int t;
      for (int k = 0; k < i; k++)
        t = 1ll * poww[k] * a[j + k + i] % 998244353,
        a[j + k + i] = add(a[j + k], 998244353 - t), upd(a[j + k], t);
    }
  }
  if (flag) {
    int inv = pw(n, 998244353 - 2);
    for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * inv % 998244353;
  }
}
inline void poly_mul(int* a, int n, int* b, int m, int* c) {
  init(n + m - 1);
  static int A[262145], B[262145];
  for (int i = 0; i < n; i++) A[i] = a[i];
  for (int i = n; i < NTT::n; i++) A[i] = 0;
  for (int i = 0; i < m; i++) B[i] = b[i];
  for (int i = m; i < NTT::n; i++) B[i] = 0;
  ntt(A, 0), ntt(B, 0);
  for (int i = 0; i < NTT::n; i++) A[i] = 1ll * A[i] * B[i] % 998244353;
  ntt(A, 1);
  for (int i = 0; i < n + m - 1; i++) c[i] = A[i];
}
inline void poly_inv(int n, int* a, int* b, int T) {
  if (n == 1) {
    b[0] = pw(a[0], 998244353 - 2);
    for (int i = 1; i < T; i++) b[i] = 0;
    return;
  }
  int K = n + 1 >> 1;
  poly_inv(K, a, b, T);
  static int A[262145], B[262145];
  init(n + K * 2 - 2);
  for (int i = 0; i < n; i++) A[i] = a[i];
  for (int i = n; i < NTT::n; i++) A[i] = 0;
  for (int i = 0; i < K; i++) B[i] = b[i];
  for (int i = K; i < NTT::n; i++) B[i] = 0;
  ntt(A, 0), ntt(B, 0);
  for (int i = 0; i < NTT::n; i++)
    A[i] = 1ll * B[i] * (2 - 1ll * A[i] * B[i] % 998244353 + 998244353) %
           998244353;
  ntt(A, 1);
  for (int i = 0; i < n; i++) b[i] = A[i];
}
inline void poly_sqrt(int n, int* a, int* b, int T) {
  if (n == 1) {
    b[0] = 1;
    for (int i = 1; i < T; i++) b[i] = 0;
    return;
  }
  int K = n + 1 >> 1;
  poly_sqrt(K, a, b, T);
  static int A[262145], B[262145], C[262145];
  poly_inv(n, b, C, n);
  init(n * 2 - 1);
  for (int i = 0; i < n; i++) A[i] = a[i];
  for (int i = n; i < NTT::n; i++) A[i] = 0;
  for (int i = 0; i < n; i++) B[i] = b[i];
  for (int i = n; i < NTT::n; i++) B[i] = 0;
  for (int i = n; i < NTT::n; i++) C[i] = 0;
  ntt(A, 0), ntt(B, 0), ntt(C, 0);
  for (int i = 0; i < NTT::n; i++)
    A[i] = 1ll * (1ll * B[i] * B[i] + A[i]) % 998244353 * (998244353 + 1) / 2 %
           998244353 * C[i] % 998244353;
  ntt(A, 1);
  for (int i = 0; i < n; i++) b[i] = A[i];
}
}  // namespace NTT
int n, m, a[262145], b[262145], c[262145], ans[262145];
int main() {
  cin >> n >> m, ++m;
  for (int i = 0, x; i < n; i++) scanf("%d", &x), a[x] = c[x] = 1;
  a[0] = 1;
  for (int i = 1; i < m; i++) a[i] = (-4 * a[i] + 998244353) % 998244353;
  NTT::poly_sqrt(m, a, b, m);
  b[0] = (b[0] + 1) % 998244353;
  NTT::poly_inv(m, b, c, m);
  for (int i = 1; i < m; i++) printf("%d\n", 2 * c[i] % 998244353);
  return 0;
}