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 inv[1000005], rev[1000005],
    gg = 3, C[1000005], D[1000005], A[1000005], F[1000005], B[1000005], n,
    a[1000005], b[1000005], m, tong[1000005], X[1000005], Y[1000005];
int ksm(int x, int y) {
  int ans = 1, t = x;
  while (y) {
    if (y % 2 == 1) {
      ans = 1ll * ans * t % 998244353;
    }
    t = 1ll * t * t % 998244353;
    y >>= 1;
  }
  return ans;
}
void init(int limit) {
  for (int i = 0; i < limit << 1; ++i) inv[i] = ksm(i, 998244353 - 2);
}
void NTT(int *a, int len, int f) {
  int limit = 1, l = 0;
  while (limit < len) limit <<= 1, ++l;
  for (int i = 0; i < limit; ++i)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = 0; i < limit; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int mid = 1; mid < limit; mid <<= 1) {
    int wn = ksm(gg, (998244353 - 1) / (mid * 2));
    if (f == -1) wn = ksm(wn, 998244353 - 2);
    for (int j = 0; j < limit; j += (mid << 1)) {
      int w = 1;
      for (int k = 0; k < mid; k++, w = 1ll * w * wn % 998244353) {
        int x = a[j + k], y = 1ll * w * a[j + mid + k] % 998244353;
        a[j + k] = (x + y >= 998244353 ? x + y - 998244353 : x + y);
        a[j + mid + k] = (x - y < 0 ? x - y + 998244353 : x - y);
      }
    }
  }
  if (f == -1) {
    int s = ksm(limit, 998244353 - 2);
    for (int i = 0; i < limit; i++) a[i] = 1ll * a[i] * s % 998244353;
  }
}
void qiuni(int a[], int b[], int len) {
  if (len == 1) {
    return (void)(b[0] = ksm(a[0], 998244353 - 2));
  }
  qiuni(a, b, len >> 1);
  for (int i = 0; i < len; i++) C[i] = a[i], D[i] = b[i];
  NTT(C, len << 1, 1);
  NTT(D, len << 1, 1);
  for (int i = 0; i < len << 1; i++)
    C[i] = 1ll * C[i] * D[i] % 998244353 * D[i] % 998244353;
  NTT(C, len << 1, -1);
  for (int i = 0; i < len; i++)
    b[i] =
        ((b[i] + b[i] % 998244353 - C[i]) % 998244353 + 998244353) % 998244353;
  for (int i = 0; i < len << 1; i++) C[i] = D[i] = 0;
}
void qiudao(int a[], int b[], int len) {
  for (int i = 1; i < len; i++) b[i - 1] = 1ll * a[i] * i % 998244353;
  b[len - 1] = 0;
}
void qiuji(int a[], int b[], int len) {
  for (int i = 1; i < len; i++) b[i] = 1ll * a[i - 1] * inv[i] % 998244353;
  b[0] = 0;
}
void getln(int a[], int b[], int len) {
  qiudao(a, A, len);
  qiuni(a, B, len);
  NTT(A, len << 1, 1);
  NTT(B, len << 1, 1);
  for (int i = 0; i < len << 1; i++) A[i] = 1ll * A[i] * B[i] % 998244353;
  NTT(A, len << 1, -1);
  qiuji(A, b, len << 1);
  for (int i = 0; i < len << 1; i++) A[i] = B[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, F, len);
  F[0] = (a[0] + 1 - F[0] < 0 ? a[0] + 1 - F[0] + 998244353 : a[0] + 1 - F[0]);
  for (int i = 1; i < len; i++)
    F[i] = (a[i] - F[i] < 0 ? a[i] - F[i] + 998244353 : a[i] - F[i]);
  NTT(F, len << 1, 1);
  NTT(b, len << 1, 1);
  for (int i = 0; i < len << 1; i++) b[i] = 1ll * b[i] * F[i] % 998244353;
  NTT(b, len << 1, -1);
  for (int i = len; i < len << 1; i++) b[i] = F[i] = 0;
}
void getsqrt(int a[], int b[], int len) {
  if (len == 1) {
    return (void)(b[0] = 1);
  }
  getsqrt(a, b, len >> 1);
  qiuni(b, X, len);
  for (int i = 0; i < len; i++) Y[i] = a[i];
  NTT(X, len << 1, 1);
  NTT(Y, len << 1, 1);
  NTT(b, len << 1, 1);
  for (int i = 0; i < len << 1; i++) {
    b[i] = 1ll * (Y[i] + 1ll * b[i] * b[i] % 998244353) % 998244353 * X[i] %
           998244353 * inv[2] % 998244353;
  }
  NTT(b, len << 1, -1);
  for (int i = 0; i < len << 1; i++) X[i] = Y[i] = 0;
  for (int i = len; i < len << 1; i++) b[i] = 0;
}
int main() {
  scanf("%d%d", &n, &m);
  m++;
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    if (x < m) a[x] = 998244349;
  }
  a[0] = 1;
  int len;
  for (len = 1; len <= m; len <<= 1)
    ;
  init(len);
  getsqrt(a, b, len);
  b[0] = (b[0] + 1) % 998244353;
  memset(a, 0, sizeof(a));
  qiuni(b, a, len);
  for (int i = 1; i < m; i++) {
    printf("%lld\n", 1ll * a[i] * 2 % 998244353);
  }
}