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;
namespace Flandre_Scarlet {
long long I() {
  char c = getchar();
  long long x = 0;
  long long f = 1;
  while (c < '0' or c > '9') f = (c == '-') ? -1 : 1, c = getchar();
  while (c >= '0' and c <= '9')
    x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  return (x = (f == 1) ? x : -x);
}
long long mI() {
  char c = getchar();
  long long x = 0, f = 1;
  while (c < '0' or c > '9') f = (c == '-') ? -1 : 1, c = getchar();
  while ('0' <= c and c <= '9')
    x = ((x << 1) + (x << 3) + (c ^ 48)) % 998244353, c = getchar();
  return (f == 1) ? x : -x;
}
void Rd(long long cnt, ...) {
  va_list args;
  va_start(args, cnt);
  for (long long i = 1; i <= cnt; ++i) {
    long long *x = va_arg(args, long long *);
    (*x) = I();
  }
  va_end(args);
}
void RA(long long *a, long long n) {
  long long *p = (a + 1);
  for (long long i = 1; i <= n; ++i) {
    (*p) = I();
    ++p;
  }
}
long long qpow(long long a, long long b, long long m = 998244353) {
  long long r = 1;
  while (b) {
    if (b & 1) r = r * a % m;
    a = a * a % m, b >>= 1;
  }
  return r;
}
long long r[1000006];
void NTT(long long A[], long long lim, long long type) {
  for (long long i = 0; i <= lim - 1; ++i)
    if (i < r[i]) swap(A[i], A[r[i]]);
  for (long long mid = 1, pp = 1; mid < lim; mid <<= 1, ++pp) {
    long long Wn =
        qpow(type == 1 ? 3 : 332748118, (998244353 - 1) / (mid << 1));
    for (long long i = 0; i < lim; i += (mid << 1)) {
      for (long long j = 0, w = 1; j < mid; ++j, w = w * Wn % 998244353) {
        long long X = A[i + j], Y = A[i + mid + j] * w % 998244353;
        A[i + j] = (X + Y) % 998244353;
        A[i + mid + j] = (X - Y + 998244353) % 998244353;
      }
    }
  }
  if (type == -1) {
    long long iv = qpow(lim, 998244353 - 2);
    for (long long i = 0; i <= lim - 1; ++i) A[i] = A[i] * iv % 998244353;
  }
}
long long A[1000006], B[1000006], C[1000006], D[1000006];
void Inv(long long a[1000006], long long b[1000006], long long n) {
  b[0] = qpow(a[0], 998244353 - 2);
  long long len, lim;
  for (len = 1; len < (n << 1); len <<= 1) {
    lim = len << 1;
    for (long long i = 0; i <= len - 1; ++i) A[i] = a[i], B[i] = b[i];
    for (long long i = 0; i <= lim - 1; ++i)
      r[i] = (r[i >> 1] >> 1) | ((i & 1) ? len : 0);
    ;
    NTT(A, lim, 1);
    NTT(B, lim, 1);
    for (long long i = 0; i <= lim - 1; ++i)
      b[i] = ((2ll - A[i] * B[i] % 998244353) * B[i] % 998244353 + 998244353) %
             998244353;
    NTT(b, lim, -1);
    for (long long i = len; i <= lim - 1; ++i) b[i] = 0;
  }
  for (long long i = 0; i <= len; ++i) A[i] = B[i] = 0;
  for (long long i = n; i <= len - 1; ++i) b[i] = 0;
}
void Sqrt(long long a[], long long b[], long long n) {
  b[0] = 1;
  long long *A = C, *B = D, i2 = (998244353 + 1) / 2;
  long long len, lim;
  for (len = 1; len < (n << 1); len <<= 1) {
    lim = len << 1;
    for (long long i = 0; i <= len - 1; ++i) A[i] = a[i];
    Inv(b, B, lim >> 1);
    for (long long i = 0; i <= lim - 1; ++i)
      r[i] = (r[i >> 1] >> 1) | ((i & 1) ? len : 0);
    ;
    NTT(A, lim, 1);
    NTT(B, lim, 1);
    for (long long i = 0; i <= lim - 1; ++i) A[i] = A[i] * B[i] % 998244353;
    NTT(A, lim, -1);
    for (long long i = 0; i <= len - 1; ++i)
      b[i] = (b[i] + A[i]) % 998244353 * i2 % 998244353;
    for (long long i = len; i <= lim - 1; ++i) b[i] = 0;
  }
  for (long long i = 0; i <= len - 1; ++i) A[i] = B[i] = 0;
  for (long long i = n; i <= len - 1; ++i) b[i] = 0;
}
long long n, m, c[1000006];
void Input() {
  n = I(), m = I();
  for (long long i = 1; i <= n; ++i) c[i] = I();
}
long long f[1000006];
long long sq[1000006], isq[1000006];
void Soviet() {
  for (long long i = 1; i <= n; ++i) f[c[i]] = 998244353 - 4;
  ++f[0];
  Sqrt(f, sq, m + 1);
  ++sq[0];
  Inv(sq, isq, m + 1);
  for (long long i = 0; i <= m; ++i) isq[i] = (isq[i] + isq[i]) % 998244353;
  for (long long i = 1; i <= m; ++i) printf("%lld\n", isq[i]);
}
void IsMyWife() {
  Input();
  Soviet();
}
}  // namespace Flandre_Scarlet
int main() {
  Flandre_Scarlet::IsMyWife();
  getchar();
  return 0;
}