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 n, m, rev[1000005];
long long g[1000005], g_sq[1000005], g_inv[1000005], f[1000005];
inline long long quick_pow(long long x, long long k) {
  long long res = 1;
  while (k) {
    if (k & 1) (res *= x) %= 998244353;
    (x *= x) %= 998244353;
    k >>= 1;
  }
  return res;
}
inline void NTT(long long *a, int n, int typ) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    long long Wn = quick_pow(3, (998244353 - 1) / (i << 1));
    if (typ == -1) Wn = quick_pow(Wn, 998244353 - 2);
    for (int j = 0; j < n; j += (i << 1)) {
      long long w = 1;
      for (int k = 0; k < i; k++, w = 1ll * w * Wn % 998244353) {
        long long x = a[j + k], y = 1ll * w * a[j + k + i] % 998244353;
        a[j + k] = (x + y) % 998244353,
              a[j + k + i] = (x - y + 998244353) % 998244353;
      }
    }
  }
  if (typ == 1) return;
  int inv = quick_pow(n, 998244353 - 2);
  for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * inv % 998244353;
}
inline int prepare(int n) {
  int lim = 1, len = 0;
  while (lim <= n) lim <<= 1, len++;
  for (int i = 0; i <= lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  return lim;
}
inline void get_inv(long long *f, long long *g, int n) {
  if (n == 1) return g[0] = quick_pow(f[0], 998244353 - 2), void();
  get_inv(f, g, (n + 1) / 2);
  static long long f_cpy[1000005];
  int lim = prepare(n * 2);
  for (int i = 0; i < n; i++) f_cpy[i] = f[i];
  for (int i = n; i <= lim; i++) f_cpy[i] = 0;
  NTT(f_cpy, lim, 1);
  NTT(g, lim, 1);
  for (int i = 0; i < lim; i++)
    g[i] = (2 * g[i] % 998244353 -
            f_cpy[i] * g[i] % 998244353 * g[i] % 998244353 + 998244353) %
           998244353;
  NTT(g, lim, -1);
  for (int i = n; i <= lim; i++) g[i] = 0;
}
inline void get_sqrt(long long *f, long long *g, int n) {
  if (n == 1) return g[0] = 1, void();
  get_sqrt(f, g, (n + 1) / 2);
  static long long inv_g[1000005], cpy[1000005];
  int lim = prepare(n * 2);
  for (int i = 0; i < n; i++) cpy[i] = 2 * g[i] % 998244353, inv_g[i] = 0;
  for (int i = n; i < lim; i++) cpy[i] = inv_g[i] = 0;
  get_inv(cpy, inv_g, n);
  for (int i = 0; i < n; i++) cpy[i] = f[i];
  for (int i = n; i < lim; i++) cpy[i] = g[i] = 0;
  NTT(cpy, lim, 1);
  NTT(g, lim, 1);
  NTT(inv_g, lim, 1);
  for (int i = 0; i < lim; i++)
    g[i] =
        (g[i] * g[i] % 998244353 + cpy[i]) % 998244353 * inv_g[i] % 998244353;
  NTT(g, lim, -1);
  for (int i = n; i < lim; i++) g[i] = 0;
}
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    (x *= 10) += ch - '0';
    ch = getchar();
  }
  return x * f;
}
int main() {
  n = read(), m = read();
  for (int i = 1; i <= n; i++) g[read()] = 1;
  for (int i = 0; i <= m; i++) g[i] = -g[i] * 4;
  g[0]++;
  get_sqrt(g, g_sq, m + 1);
  g_sq[0]++;
  get_inv(g_sq, g_inv, m + 1);
  for (int i = 1; i <= m; i++)
    f[i] = g_inv[i] * 2 % 998244353, printf("%lld\n", f[i]);
  return 0;
}