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 long long mod = 998244353;
const long long inv2 = (mod + 1) >> 1;
int n, m;
long long G[200005 << 2], sqr[200005 << 2], inv[200005 << 2], tmp[200005 << 2];
long long Pow(long long x, int n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = res * x % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return res;
}
int lim, wei, to[200005 << 2];
void NTT(long long *A, int f) {
  for (int i = 1; i < lim; i++)
    if (i < to[i]) swap(A[i], A[to[i]]);
  for (int i = 1; i < lim; i <<= 1) {
    long long base = Pow(3, (mod - 1) / (i << 1));
    if (f == -1) base = Pow(base, mod - 2);
    for (int j = 0, stp = i << 1; j < lim; j += stp) {
      long long w = 1;
      for (int k = 0; k < i; k++, w = w * base % mod) {
        long long a = A[k + j], b = w * A[k + j + i] % mod;
        A[k + j] = (a + b) % mod;
        A[k + j + i] = (a - b + mod) % mod;
      }
    }
  }
}
void prework(int all) {
  for (lim = 1, wei = 0; lim < all; lim <<= 1, wei++)
    ;
  for (int i = 0; i < lim; i++)
    to[i] = (to[i >> 1] >> 1) | ((i & 1) << (wei - 1));
}
void Mulinv(long long *A, int la, long long *B, int lb) {
  prework(la * 2 + lb);
  NTT(A, 1);
  NTT(B, 1);
  for (int i = 0; i < lim; i++) {
    A[i] = (2 - B[i] * A[i]) % mod * A[i] % mod;
    if (A[i] < 0) A[i] += mod;
  }
  NTT(A, -1);
  long long in = Pow(lim, mod - 2);
  for (int i = 0; i < lb; i++) A[i] = A[i] * in % mod;
  for (int i = lb; i < lim; i++) A[i] = 0;
}
long long tmpinv[200005 << 2];
void Inverse(long long *A, long long *B, int len) {
  if (len == 1) {
    B[0] = Pow(A[0], mod - 2);
    return;
  }
  int mi = (len + 1) >> 1;
  Inverse(A, B, mi);
  memcpy(tmpinv, A, sizeof(long long) * len);
  Mulinv(B, mi, tmpinv, len);
  memset(tmpinv, 0, sizeof(long long) * lim);
}
long long tmpsqr[200005 << 2], tmpA[200005 << 2];
void Mulsqr(long long *A, int la, long long *B, int lb) {
  prework(la + lb);
  NTT(A, 1), NTT(B, 1);
  for (int i = 0; i < lim; i++) A[i] = A[i] * B[i] % mod * inv2 % mod;
  NTT(A, -1);
  long long in = Pow(lim, mod - 2);
  for (int i = 0; i < lim; i++) A[i] = A[i] * in % mod;
}
void Sqrt(long long *A, long long *B, int len) {
  if (len == 1) {
    B[0] = 1;
    return;
  }
  int mi = (len + 1) >> 1;
  Sqrt(A, B, mi);
  Inverse(B, tmpsqr, len);
  memcpy(tmpA, A, sizeof(long long) * len);
  Mulsqr(tmpsqr, len, tmpA, len);
  for (int i = 0; i < len; i++) B[i] = (B[i] * inv2 + tmpsqr[i]) % mod;
  for (int i = 0; i < lim; i++) tmpsqr[i] = tmpA[i] = 0;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, x; i <= n; i++) {
    scanf("%d", &x);
    tmp[x] = mod - 4;
  }
  tmp[0]++;
  Sqrt(tmp, sqr, m + 1);
  sqr[0]++;
  Inverse(sqr, inv, m + 1);
  for (int i = 1; i <= m; i++) printf("%lld\n", (inv[i] << 1) % mod);
  return 0;
}