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 RA {
int r(int p) { return 1ll * rand() * rand() % p; }
int r(int L, int R) { return r(R - L + 1) + L; }
}  // namespace RA
const int SZ = 1 << 19, P = 998244353;
int pw(int a, int m) {
  if (m < 0) m += P - 1;
  int res = 1;
  while (m) m & 1 ? res = 1ll * res * a % P : 0, a = 1ll * a * a % P, m >>= 1;
  return res;
}
int tr[SZ];
int init(int n) {
  int len = 1;
  while (len < n) len <<= 1;
  for (int i = (0); i <= (len - 1); ++i)
    tr[i] = tr[i >> 1] >> 1 | ((i & 1) * (len / 2));
  return len;
}
void dft(int *f, int len, int tag) {
  for (int i = (0); i <= (len - 1); ++i)
    if (i < tr[i]) swap(f[i], f[tr[i]]);
  for (int i = (0); i <= (len - 1); ++i) f[i] = (f[i] + P) % P;
  for (int j = 1; j < len; j <<= 1)
    for (int i = 0, wn = pw(3, (P - 1) / (j << 1) * tag); i < len; i += j << 1)
      for (int k = i, u, v, w = 1; k < i + j; k++, w = 1ll * w * wn % P)
        u = f[k], v = f[k + j] * 1ll * w % P, f[k] = (u + v) % P,
        f[k + j] = (u - v + P) % P;
  if (tag == -1)
    for (int i = 0, ilen = pw(len, P - 2); i < len; i++)
      f[i] = 1ll * f[i] * ilen % P;
}
int inv_h[SZ];
void inv(int *f, int *g, int n) {
  if (n == 1) return g[0] = pw(f[0], P - 2), void();
  inv(f, g, (n + 1) / 2);
  int len = init(2 * (n));
  for (int i = (0); i <= (len - 1); ++i) inv_h[i] = 0;
  for (int i = ((n + 1) / 2); i <= (len - 1); ++i) g[i] = 0;
  for (int i = (0); i <= (n - 1); ++i) inv_h[i] = f[i];
  dft(inv_h, len, 1), dft(g, len, 1);
  for (int i = (0); i <= (len - 1); ++i)
    inv_h[i] = 1ll * inv_h[i] * g[i] % P * g[i] % P;
  dft(g, len, -1), dft(inv_h, len, -1);
  for (int i = (0); i <= (n - 1); ++i) g[i] = (g[i] * 2ll - inv_h[i] + P) % P;
  for (int i = (n); i <= (len - 1); ++i) g[i] = 0;
}
int ln_h[SZ];
void ln(int *f, int *g, int n) {
  inv(f, g, n);
  int len = init(n * 2);
  for (int i = (n); i <= (len - 1); ++i) ln_h[i] = g[i] = 0;
  ln_h[n - 1] = 0;
  for (int i = (1); i <= (n - 1); ++i) ln_h[i - 1] = f[i] * 1ll * i % P;
  dft(ln_h, len, 1), dft(g, len, 1);
  for (int i = (0); i <= (len - 1); ++i) g[i] = 1ll * g[i] * ln_h[i] % P;
  dft(g, len, -1);
  for (int i = (n - 1); i >= (1); --i) g[i] = g[i - 1] * 1ll * pw(i, P - 2) % P;
  g[0] = 0;
}
int t2[SZ], h2[SZ];
void exp(int *f, int *g, int n) {
  if (n == 1) return g[0] = 1, void();
  exp(f, g, (n + 1) / 2);
  for (int i = ((n + 1) / 2); i <= (n - 1); ++i) g[i] = 0;
  ln(g, h2, n);
  for (int i = (0); i <= (n - 1); ++i) t2[i] = (f[i] - h2[i] + P) % P;
  t2[0] = (t2[0] + 1) % P;
  int len = init(n * 2);
  for (int i = (n); i <= (len); ++i) g[i] = t2[i] = 0;
  dft(g, len, 1), dft(t2, len, 1);
  for (int i = (0); i <= (len - 1); ++i) g[i] = g[i] * 1ll * t2[i] % P;
  dft(g, len, -1);
}
int n, m;
int g[SZ], g2[SZ];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (n); ++i) {
    int c;
    scanf("%d", &c);
    g[c] = 1;
  }
  for (int i = (0); i <= (m); ++i) g[i] *= -4;
  g[0]++;
  assert(g[0] == 1);
  ln(g, g2, m + 1);
  for (int i = (0); i <= (m); ++i) g2[i] = g2[i] * 1ll * ((P + 1) / 2) % P;
  exp(g2, g, m + 1);
  g[0]++;
  inv(g, g2, m + 1);
  for (int i = (0); i <= (m); ++i) g2[i] = g2[i] * 2ll % P;
  for (int i = (1); i <= (m); ++i) printf("%d\n", g2[i]);
  return 0;
}