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>
namespace my_std {
using namespace std;
template <typename T>
inline void read(T &t) {
  t = 0;
  char f = 0, ch = getchar();
  double d = 0.1;
  while (ch > '9' || ch < '0') f |= (ch == '-'), ch = getchar();
  while (ch <= '9' && ch >= '0') t = t * 10 + ch - 48, ch = getchar();
  if (ch == '.') {
    ch = getchar();
    while (ch <= '9' && ch >= '0') t += d * (ch ^ 48), d *= 0.1, ch = getchar();
  }
  t = (f ? -t : t);
}
template <typename T, typename... Args>
inline void read(T &t, Args &...args) {
  read(t);
  read(args...);
}
void file() {}
}  // namespace my_std
using namespace my_std;
long long ksm(long long x, int y) {
  long long ret = 1;
  for (; y; y >>= 1, x = x * x % 998244353)
    if (y & 1) ret = ret * x % 998244353;
  return ret;
}
long long inv(long long x) { return ksm(x, 998244353 - 2); }
int limit, r[404040];
long long G[404040], _G[404040];
void init() {
  for (int mid = 1; mid < 404040; mid <<= 1)
    _G[mid] = inv(G[mid] = ksm(3, (998244353 - 1) / mid >> 1));
}
void NTT_init(int n) {
  limit = 1;
  int l = -1;
  while (limit <= n + n) limit <<= 1, ++l;
  for (int i = (0); i <= (limit - 1); i++)
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << l);
}
void NTT(long long *a, int type) {
  for (int i = (0); i <= (limit - 1); i++)
    if (i < r[i]) swap(a[i], a[r[i]]);
  for (int i = (0); i <= (limit - 1); i++) a[i] %= 998244353;
  for (int mid = 1; mid < limit; mid <<= 1) {
    long long Wn = (type == 1) ? G[mid] : _G[mid];
    for (int j = 0, len = mid << 1; j < limit; j += len) {
      long long w = 1;
      for (int k = 0; k < mid; k++, w = w * Wn % 998244353) {
        long long x = a[j + k], y = a[j + k + mid] * w;
        a[j + k] = (x + y) % 998244353;
        a[j + k + mid] = (1ll * 998244353 * 998244353 - y + x) % 998244353;
      }
    }
  }
  if (type == 1) return;
  long long I = inv(limit);
  for (int i = (0); i <= (limit - 1); i++) a[i] = a[i] * I % 998244353;
}
long long tmp1[404040], tmp2[404040], tmp3[404040], tmp4[404040];
void PolyInv(long long *a, long long *f, int n) {
  if (n == 1) return (void)(f[0] = inv(a[0]));
  int mid = (n + 1) >> 1;
  PolyInv(a, f, mid);
  NTT_init(n);
  for (int i = (0); i <= (mid - 1); i++) tmp1[i] = f[i];
  for (int i = (mid); i <= (limit - 1); i++) tmp1[i] = 0;
  for (int i = (0); i <= (n - 1); i++) tmp2[i] = a[i];
  for (int i = (n); i <= (limit - 1); i++) tmp2[i] = 0;
  NTT(tmp1, 1);
  NTT(tmp2, 1);
  for (int i = (0); i <= (limit - 1); i++)
    tmp1[i] =
        tmp1[i] * (998244353 + 2 - tmp1[i] * tmp2[i] % 998244353) % 998244353;
  NTT(tmp1, -1);
  for (int i = (0); i <= (n - 1); i++) f[i] = tmp1[i];
  for (int i = (0); i <= (limit - 1); i++) tmp1[i] = tmp2[i] = 0;
}
void PolySqrt(long long *a, long long *f, int n) {
  if (n == 1) return (void)(f[0] = sqrt(a[0]) + 0.5);
  int mid = (n + 1) >> 1;
  PolySqrt(a, f, mid);
  PolyInv(f, tmp3, n);
  for (int i = (0); i <= (n - 1); i++) tmp1[i] = a[i], tmp2[i] = f[i];
  NTT_init(n);
  NTT(tmp1, 1);
  NTT(tmp2, 1);
  NTT(tmp3, 1);
  long long inv2 = inv(2);
  for (int i = (0); i <= (limit - 1); i++)
    tmp1[i] = inv2 * (tmp1[i] * tmp3[i] % 998244353 + tmp2[i]) % 998244353;
  NTT(tmp1, -1);
  for (int i = (0); i <= (n - 1); i++) f[i] = tmp1[i];
  for (int i = (0); i <= (limit - 1); i++) tmp1[i] = tmp2[i] = tmp3[i] = 0;
}
int n, m;
long long a[404040];
long long tt1[404040], tt2[404040];
long long ans[404040];
int main() {
  file();
  init();
  read(n, m);
  int x;
  for (int i = (1); i <= (n); i++) read(x), a[x] = 1;
  tt1[0] = 1;
  for (int i = (1); i <= (m); i++) tt1[i] = 998244353 - 4 * a[i] % 998244353;
  PolySqrt(tt1, tt2, m + 1);
  ++tt2[0];
  PolyInv(tt2, ans, m + 1);
  for (int i = (1); i <= (m); i++) ans[i] = ans[i] * 2 % 998244353;
  for (int i = (1); i <= (m); i++) printf("%lld\n", ans[i]);
  return 0;
}