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 std::max;
using std::min;
using std::swap;
using std::vector;
const int N = 4e5 + 5;
const int mod = 998244353;
int lim, rev[N], f[N];
int n, m, tmpa[N], c[N];
int a[N], b[N], tmpb[N];
int ksm(int a, int b, int ans = 1) {
  while (b) {
    if (b & 1) ans = 1ll * ans * a % mod;
    a = 1ll * a * a % mod;
    b >>= 1;
  }
  return ans;
}
void ntt(int *f, int opt) {
  for (int i = 0; i < lim; i++)
    if (i < rev[i]) swap(f[i], f[rev[i]]);
  for (int mid = 1; mid < lim; mid <<= 1) {
    int tmp = ksm(3, (mod - 1) / (mid << 1));
    if (opt < 0) tmp = ksm(tmp, mod - 2);
    for (int R = mid << 1, j = 0; j < lim; j += R) {
      int w = 1;
      for (int k = 0; k < mid; k++, w = 1ll * w * tmp % mod) {
        int x = f[j + k], y = 1ll * w * f[j + k + mid] % mod;
        f[j + k] = (x + y) % mod, f[j + k + mid] = (mod + x - y) % mod;
      }
    }
  }
  if (opt < 0)
    for (int in = ksm(lim, mod - 2), i = 0; i < lim; i++)
      f[i] = 1ll * f[i] * in % mod;
}
void get(int n) {
  lim = 1;
  while (lim <= n) lim <<= 1;
  for (int i = 1; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? lim >> 1 : 0);
}
void solveinv(int len, int *a, int *b) {
  if (len == 1) return b[0] = ksm(a[0], mod - 2), void();
  solveinv(len >> 1, a, b);
  get(len);
  for (int i = 0; i < len; i++) tmpa[i] = a[i];
  ntt(tmpa, 1), ntt(b, 1);
  for (int i = 0; i < lim; i++)
    b[i] = 1ll * b[i] * (2ll - 1ll * tmpa[i] * b[i] % mod + mod) % mod;
  ntt(b, -1);
  for (int i = len; i < lim; i++) b[i] = 0;
  for (int i = 0; i < lim; i++) tmpa[i] = 0;
}
void solvesqr(int len, int *a, int *b) {
  if (len == 1) return b[0] = 1, void();
  solvesqr(len >> 1, a, b);
  solveinv(len, b, tmpb);
  get(len);
  for (int i = 0; i < len; i++) tmpa[i] = a[i];
  ntt(tmpb, 1), ntt(tmpa, 1);
  for (int i = 0; i < lim; i++) tmpa[i] = 1ll * tmpa[i] * tmpb[i] % mod;
  ntt(tmpa, -1);
  for (int i = 0, inv2 = mod + 1 >> 1; i < lim; i++)
    b[i] = 1ll * (tmpa[i] + b[i]) % mod * inv2 % mod;
  for (int i = len; i < lim; i++) b[i] = 0;
  for (int i = 0; i < lim; i++) tmpa[i] = tmpb[i] = 0;
}
int getint() {
  int X = 0, w = 0;
  char ch = getchar();
  while (!isdigit(ch)) w |= ch == '-', ch = getchar();
  while (isdigit(ch)) X = X * 10 + ch - 48, ch = getchar();
  if (w) return -X;
  return X;
}
signed main() {
  n = getint(), m = getint();
  for (int i = 1; i <= n; i++) {
    int x = getint();
    a[x] = 1;
  }
  for (int i = 1; i <= m; i++)
    if (a[i]) a[i] = mod - 4;
  get(m);
  a[0] = 1;
  solvesqr(lim, a, b);
  get(m);
  b[0]++;
  solveinv(lim, b, c);
  for (int i = 1; i <= m; i++) printf("%lld\n", 2ll * c[i] % mod);
  return 0;
}