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;
const int N = 4e5 + 10;
int f[N], g[N], r[N], h[N], n, inv2 = (998244353) - (998244353) / 2;
void gen(int m) {
  int l = 0;
  for (n = 1; n <= m; n <<= 1) l++;
  for (int i = 1; i < n; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
}
int qpow(int x, int y) {
  int ret = 1;
  while (y) {
    if (y & 1) ret = 1ll * ret * x % (998244353);
    x = 1ll * x * x % (998244353), y >>= 1;
  }
  return ret;
}
void dft(int x[], int d) {
  for (int i = 0; i < n; i++)
    if (i > r[i]) swap(x[i], x[r[i]]);
  int t, w, o;
  for (int i = 1; i < n; i <<= 1) {
    o = qpow(3, d * ((998244353) - 1) / (i << 1) + (998244353) - 1);
    for (int j = 0; j < n; j += (i << 1)) {
      w = 1;
      for (int k = 0; k < i; k++, w = 1ll * w * o % (998244353))
        t = 1ll * x[i + j + k] * w % (998244353),
        x[i + j + k] = (x[j + k] - t + (998244353)) % (998244353),
        (x[j + k] += t) %= (998244353);
    }
  }
}
void mul(int x[], int y[], int z[], int m, int mode = 0) {
  gen(m << 1);
  int a[N] = {0}, b[N] = {0};
  copy(x, x + m, a), copy(y, y + m, b);
  dft(a, 1), dft(b, 1);
  for (int i = 0; i < n; i++)
    if (!mode)
      a[i] = 1ll * a[i] * b[i] % (998244353);
    else
      a[i] =
          (2ll * b[i] - 1ll * a[i] * b[i] % (998244353) * b[i] % (998244353) +
           (998244353)) %
          (998244353);
  dft(a, -1);
  int inv = qpow(n, (998244353) - 2);
  for (int i = 0; i < m; i++) z[i] = 1ll * inv * a[i] % (998244353);
}
int res[N], c[N];
void pinv(int x[], int y[], int deg) {
  if (deg == 1) {
    y[0] = qpow(x[0], (998244353) - 2);
    return;
  }
  pinv(x, y, (deg + 1) >> 1);
  mul(x, y, y, deg, 1);
}
void psqrt(int x[], int y[], int deg) {
  if (deg == 1) {
    y[0] = x[0];
    return;
  }
  psqrt(x, y, (deg + 1) >> 1);
  int a[N] = {0};
  pinv(y, a, deg);
  mul(x, a, a, deg);
  for (int i = 0; i < deg; i++) y[i] = 1ll * inv2 * (y[i] + a[i]) % (998244353);
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n, m;
  cin >> n >> m;
  int na;
  for (int i = 1; i <= n; i++) cin >> na, f[na] = (998244353) - 4;
  f[0] = 1;
  psqrt(f, g, m + 1);
  g[0] = (g[0] + 1) % (998244353), pinv(g, h, m + 1);
  for (int i = 1; i <= m; i++) cout << 1ll * 2 * h[i] % (998244353) << '\n';
  return 0;
}