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 power(int a, int b) {
  int re = 1;
  while (b) {
    if (b & 1) re = 1ll * re * a % 998244353;
    a = 1ll * a * a % 998244353, b >>= 1;
  }
  return re;
}
void ntt(int x[], int n, int type) {
  for (int i = 0, t = 0; i < n; ++i) {
    if (i > t) swap(x[i], x[t]);
    for (int j = n >> 1; (t ^= j) < j; j >>= 1)
      ;
  }
  for (int s = 2; s <= n; s <<= 1) {
    int wn = power(3, (998244353 - 1) / s);
    for (int i = 0; i < n; i += s)
      for (int w = 1, t, j = 0; j < s >> 1; w = 1ll * w * wn % 998244353, ++j)
        t = 1ll * w * x[i + j + (s >> 1)] % 998244353,
        x[i + j + (s >> 1)] = (x[i + j] - t + 998244353) % 998244353,
        x[i + j] = (x[i + j] + t) % 998244353;
  }
  if (type == -1) {
    reverse(x + 1, x + n);
    int inv = power(n, 998244353 - 2);
    for (int i = 0; i < n; ++i) x[i] = 1ll * x[i] * inv % 998244353;
  }
}
void getinv(int a[], int b[], int n) {
  static int c[262150];
  if (n == 1) {
    b[0] = power(a[0], 998244353 - 2);
    return;
  }
  getinv(a, b, n >> 1);
  memcpy(c, a, n * sizeof(int));
  memset(c + n, 0, n * sizeof(int));
  ntt(c, n << 1, 1), ntt(b, n << 1, 1);
  for (int i = 0; i < n << 1; ++i)
    c[i] = 1ll * b[i] * (2 - 1ll * b[i] * c[i] % 998244353 + 998244353) %
           998244353;
  ntt(c, n << 1, -1);
  memcpy(b, c, n * sizeof(int));
  memset(b + n, 0, n * sizeof(int));
}
void getsqrt(int a[], int b[], int n) {
  static int c[262150], _b[262150];
  if (n == 1) {
    b[0] = 1;
    return;
  }
  getsqrt(a, b, n >> 1);
  memset(_b, 0, n * sizeof(int));
  getinv(b, _b, n);
  memcpy(c, a, n * sizeof(int));
  memset(c + n, 0, n * sizeof(int));
  ntt(c, n << 1, 1), ntt(b, n << 1, 1), ntt(_b, n << 1, 1);
  for (int i = 0; i < n << 1; ++i)
    c[i] = 1ll * (998244353 + 1) / 2 * (b[i] + 1ll * _b[i] * c[i] % 998244353) %
           998244353;
  ntt(c, n << 1, -1);
  memcpy(b, c, n * sizeof(int));
  memset(b + n, 0, n * sizeof(int));
}
int n, m, f[262150], g[262150];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
int main() {
  cin >> n >> m;
  f[0] = 1;
  for (int i = 1; i <= n; ++i) f[read()] = 998244353 - 4;
  int t = 1;
  while (t <= m) t <<= 1;
  getsqrt(f, g, t);
  ++g[0];
  memset(f, 0, sizeof f);
  getinv(g, f, t);
  for (int i = 1; i <= m; ++i) printf("%d\n", f[i] * 2 % 998244353);
  return 0;
}