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 g = 3;
const int mod = 998244353;
const int M = 400009;
char s;
int read() {
  int f = 1, re = 0;
  char ch;
  for (ch = getchar(); !isdigit(ch) && ch != '-'; ch = getchar())
    ;
  if (ch == '-') {
    f = -1, ch = getchar();
  }
  for (; isdigit(ch); ch = getchar()) re = (re << 3) + (re << 1) + ch - '0';
  return re * f;
}
int ksm(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = (long long)ans * a % mod;
    a = (long long)a * a % mod;
    b >>= 1;
  }
  return ans % mod;
}
int c[M], d[M], n, m, r[M], tmp[M], a[M], b[M],
    inv2 = ksm(2, mod - 2), dera[M], inva[M], lnb[M], lna[M], k, aa[M], bb[M],
    aaa[M], bbb[M], invb[M], F[M], cpy[M];
void ntt(int *A, int lim, int type) {
  for (int i = 0; i < lim; i++)
    if (i < r[i]) swap(A[i], A[r[i]]);
  for (int mid = 1; mid < lim; mid <<= 1) {
    int W = ksm(g, (mod - 1) / (mid << 1));
    for (int R = mid << 1, j = 0; j < lim; j += R) {
      int w = 1;
      for (long long k = 0; k < mid; k++, w = (long long)w * W % mod) {
        int x = A[j + k], y = (long long)w * A[j + k + mid] % mod;
        A[j + k] = (x + y) % mod;
        A[j + mid + k] = (x - y + mod) % mod;
      }
    }
  }
  if (type == -1) {
    reverse(A + 1, A + lim);
    int inv = ksm(lim, mod - 2);
    for (int i = 0; i < lim; i++) A[i] = (long long)A[i] * inv % mod;
  }
}
void getmul(int a[], int b[], int c[], int n, int m) {
  int lim = 1, l = 0;
  while (lim <= n + m) lim <<= 1, l++;
  for (int i = 1; i < lim; i++) r[i] = (r[i >> 1] >> 1 | (i & 1) << (l - 1));
  for (int i = 0; i <= n; i++) aa[i] = a[i];
  for (int i = 0; i <= m; i++) bb[i] = b[i];
  ntt(aa, lim, 1), ntt(bb, lim, 1);
  for (int i = 0; i < lim; i++) {
    c[i] = (long long)aa[i] * bb[i] % mod;
    aa[i] = bb[i] = 0;
  }
  ntt(c, lim, -1);
}
void getinv(int a[], int b[], int len) {
  if (len == 1) {
    b[0] = ksm(a[0], mod - 2);
    return;
  }
  getinv(a, b, (len + 1) >> 1);
  int lim = 1, l = 0;
  while (lim < len + len) lim <<= 1, l++;
  for (int i = 0; i < lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = 0; i < len; i++) tmp[i] = a[i];
  for (int i = len; i < lim; i++) tmp[i] = 0;
  ntt(tmp, lim, 1), ntt(b, lim, 1);
  for (int i = 0; i < lim; i++)
    b[i] = (long long)b[i] *
           ((2 - (long long)tmp[i] * b[i] % mod + mod) % mod) % mod;
  ntt(b, lim, -1);
  for (int i = len; i < lim; i++) b[i] = 0;
}
void getdiv(int a[], int b[], int c[], int d[], int n, int m) {
  for (int i = 0; i <= n; i++) aaa[i] = a[i];
  for (int i = 0; i <= m; i++) bbb[i] = b[i];
  reverse(aaa, aaa + n + 1), reverse(bbb, bbb + m + 1);
  getinv(bbb, invb, n - m + 1);
  getmul(aaa, invb, c, n - m, n - m);
  reverse(c, c + n - m + 1);
  reverse(aaa, aaa + n + 1);
  reverse(bbb, bbb + m + 1);
  getmul(c, bbb, d, n - m, m);
  for (int i = 0; i < m; i++) d[i] = (aaa[i] - d[i] + mod) % mod;
  for (int i = 0; i <= n; i++) aaa[i] = 0;
  for (int i = 0; i <= m; i++) bbb[i] = 0;
}
void getsqrt(int a[], int b[], int len) {
  if (len == 1) return (void)(b[0] = 1);
  getsqrt(a, b, (len + 1) >> 1);
  for (int i = 0; i <= (len << 1); i++) F[i] = 0;
  getinv(b, F, len);
  int lim = 1, l = 0;
  while (lim < len + len) lim <<= 1, l++;
  for (int i = 0; i < lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = 0; i < len; i++) cpy[i] = a[i];
  for (int i = len; i < lim; i++) cpy[i] = 0;
  ntt(cpy, lim, 1), ntt(b, lim, 1), ntt(F, lim, 1);
  for (int i = 0; i < lim; i++)
    b[i] =
        ((long long)((long long)(b[i] + (long long)cpy[i] * F[i] % mod) % mod) *
         inv2) %
        mod;
  ntt(b, lim, -1);
  for (int i = len; i < lim; i++) b[i] = 0;
}
void getintegral(int a[], int b[], int len) {
  for (int i = 1; i < len; i++)
    b[i] = (long long)a[i - 1] * ksm(i, mod - 2) % mod;
  b[0] = 0;
}
void getderivation(int a[], int b[], int len) {
  for (int i = 1; i < len; i++) b[i - 1] = (long long)a[i] * i % mod;
  b[len - 1] = 0;
}
void getln(int a[], int b[], int len) {
  getinv(a, inva, len);
  getderivation(a, dera, len);
  int lim = 1, l = 0;
  while (lim < len + len) lim <<= 1, l++;
  for (int i = 0; i < lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  ntt(inva, lim, 1), ntt(dera, lim, 1);
  for (int i = 0; i < lim; i++) inva[i] = (long long)inva[i] * dera[i] % mod;
  ntt(inva, lim, -1);
  getintegral(inva, b, len);
  for (int i = 0; i < lim; i++) inva[i] = dera[i] = 0;
}
void getexp(int a[], int b[], int len) {
  if (len == 1) return (void)(b[0] = 1);
  getexp(a, b, len >> 1), getln(b, lnb, len);
  for (int i = 0; i < len; i++)
    lnb[i] = (long long)(a[i] - lnb[i] + (i == 0) + mod) % mod;
  int lim = (len << 1);
  ntt(lnb, lim, 1), ntt(b, lim, 1);
  for (int i = 0; i < lim; i++) b[i] = (long long)lnb[i] * b[i] % mod;
  ntt(b, lim, -1);
  for (int i = len; i < lim; i++) lnb[i] = b[i] = 0;
}
void getksm(int a[], int b[], int len, int k) {
  getln(a, lna, len);
  for (int i = 0; i < len; i++) lna[i] = (long long)k * lna[i] % mod;
  getexp(lna, b, len);
}
signed main() {
  n = read(), m = read();
  a[0] = 1;
  for (int i = 1; i <= n; i++) a[read()] = -4;
  int lim = 1;
  while (lim <= m) lim <<= 1;
  getsqrt(a, b, lim);
  b[0] = (long long)(b[0] + 1) % mod;
  getinv(b, c, lim);
  for (int i = 1; i <= m; i++) printf("%d\n", (long long)c[i] * 2 % mod);
  return 0;
}