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;
long long ksm(long long x, long long y) {
  long long r = 1;
  while (y) (y & 1) && (r = r * x % 998244353), y >>= 1, x = x * x % 998244353;
  return r;
}
long long F[530005], G[530005], A[530005], u1[530005], u2[530005], a[530005],
    F0[530005], tmp0[530005], tmp1[530005];
int r[530005], mx;
void NTT(long long *f, int typ) {
  int i, j, k, R, W;
  long long w, x, y;
  for (i = 0; i < mx; ++i)
    if (i < r[i]) swap(f[i], f[r[i]]);
  for (k = 1; k < mx; k <<= 1) {
    R = k << 1, W = ksm(3ll, (998244353 - 1) / R),
    (typ < 0) && (W = ksm(W, 998244353 - 2));
    for (i = 0; i < mx; i += R) {
      w = 1;
      for (j = 0; j < k; ++j, w = w * W % 998244353)
        x = f[i + j], y = w * f[i + j + k], f[i + j] = (x + y) % 998244353,
        f[i + j + k] = (x - y) % 998244353;
    }
  }
  if (typ == -1) {
    x = ksm(mx, 998244353 - 2);
    for (i = 0; i < mx; ++i) f[i] = f[i] * x % 998244353;
  }
}
int n, m, i;
void NY(int x) {
  if (x == 1) {
    A[0] = ksm(G[0], 998244353 - 2);
    return;
  }
  NY(x / 2);
  mx = x + x;
  for (i = 1; i < mx; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) * x);
  for (i = 0; i < x; ++i) u1[i] = G[i];
  for (i = x; i < mx; ++i) u1[i] = 0;
  for (i = 0; i < mx; ++i) u2[i] = A[i];
  NTT(u1, 1), NTT(u2, 1);
  for (i = 0; i < mx; ++i)
    u1[i] = u2[i] * u2[i] % 998244353 * u1[i] % 998244353;
  NTT(u1, -1);
  for (i = 0; i < x; ++i) A[i] = (A[i] * 2 - u1[i]) % 998244353;
}
void ln(int x) {
  mx = x;
  for (i = 0; i < x; ++i) A[i] = A[i + x] = 0, G[i] = F0[i];
  NY(mx);
  mx = x + x;
  for (i = 1; i < mx; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) * x);
  for (i = 0; i < mx; ++i) F0[i] = F0[i + 1] * (i + 1) % 998244353;
  NTT(A, 1);
  NTT(F0, 1);
  for (i = 0; i < mx; ++i) F0[i] = F0[i] * A[i] % 998244353;
  NTT(F0, -1);
  for (i = x - 1; i; --i) F0[i] = F0[i - 1] * ksm(i, 998244353 - 2) % 998244353;
  F0[0] = 0;
  mx = x;
}
void EXP(int x) {
  if (x == 1) {
    F0[0] = 1;
    return;
  }
  EXP(x / 2);
  mx = x + x;
  for (i = 0; i < x; ++i) tmp0[i] = F0[i];
  for (i = x; i < mx; ++i) tmp0[i] = 0;
  ln(mx);
  mx = x + x;
  --F0[0];
  for (i = 0; i < x; ++i) tmp1[i] = (F[i] - F0[i]) % 998244353;
  for (i = x; i < mx; ++i) tmp1[i] = 0;
  for (i = 1; i < mx; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) * x);
  NTT(tmp0, 1), NTT(tmp1, 1);
  for (i = 0; i < mx; ++i) tmp0[i] = tmp1[i] * tmp0[i] % 998244353;
  NTT(tmp0, -1);
  for (i = 0; i < x; ++i) F0[i] = (tmp0[i] + 998244353) % 998244353;
  for (i = x; i < mx; ++i) F0[i] = 0;
}
long long cc, k, uu;
int main() {
  cin >> n >> m;
  for (i = 1; i <= n; ++i) cin >> cc, (cc <= m) && (F[cc] = -4);
  F[0] = 1;
  for (i = 0; i <= m; ++i) F0[i] = F[i];
  mx = 1;
  while (mx <= m) mx <<= 1;
  ln(mx);
  k = 499122177;
  for (i = 0; i < mx; ++i) F[i] = F0[i] * k % 998244353;
  memset(F0, 0, sizeof(F0));
  EXP(mx);
  ++F0[0];
  mx = 1;
  while (mx <= m + m) mx <<= 1;
  for (i = 0; i < mx; ++i) G[i] = F0[i];
  memset(A, 0, sizeof(A));
  memset(u1, 0, sizeof(A));
  memset(u2, 0, sizeof(A));
  NY(mx);
  for (i = 1; i <= m; ++i) {
    cout << (A[i] * 2 % 998244353 + 998244353) % 998244353 << "\n";
  }
}