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, x, a[270000], b[270000], c[270000], d[270000], e[270000], X[270000],
    Y[270000], Z[270000], w[270000];
int mi(int x, int y) {
  int t = 1;
  while (y) {
    if (y & 1) t = (long long)t * x % 998244353;
    x = (long long)x * x % 998244353;
    y /= 2;
  }
  return t;
}
void NTT(int *A, int *B, int l, int n, int k) {
  if (n == 1) {
    B[l] = A[l];
    return;
  }
  int mid = n / 2, y = l + mid;
  for (int i = 0; i < mid; i++)
    B[l + i] = A[l + i * 2], B[y + i] = A[l + i * 2 + 1];
  NTT(B, A, l, mid, k * 2);
  NTT(B, A, y, mid, k * 2);
  for (int i = 0; i < mid; i++) {
    B[l + i] = (A[l + i] + (long long)w[i * k] * A[y + i]) % 998244353;
    B[y + i] =
        (A[l + i] - (long long)w[i * k] * A[y + i] % 998244353 + 998244353) %
        998244353;
  }
}
void Q(int *A, int *B, int *C, int n) {
  int o = 1;
  while (o < n) o *= 2;
  o *= 2;
  int t = mi(3, (998244353 - 1) / o), ni = mi(o, 998244353 - 2);
  w[0] = 1;
  for (int i = 1; i <= o; i++) w[i] = (long long)w[i - 1] * t % 998244353;
  for (int i = 0; i < o; i++) X[i] = 0;
  for (int i = 0; i < n; i++) X[i] = A[i];
  NTT(X, Y, 0, o, 1);
  for (int i = 0; i < o; i++) X[i] = 0;
  for (int i = 0; i < n; i++) X[i] = B[i];
  NTT(X, Z, 0, o, 1);
  for (int i = 0; i < o; i++) Z[i] = (long long)Y[i] * Z[i] % 998244353;
  for (int i = 1; i * 2 <= o; i++) swap(w[i], w[o - i]);
  NTT(Z, C, 0, o, 1);
  for (int i = 0; i < o; i++) C[i] = (long long)C[i] * ni % 998244353;
}
void A(int *A, int *B, int *C, int n) {
  int o = 1;
  while (o < n) o *= 2;
  o *= 2;
  int t = mi(3, (998244353 - 1) / o), ni = mi(o, 998244353 - 2);
  w[0] = 1;
  for (int i = 1; i <= o; i++) w[i] = (long long)w[i - 1] * t % 998244353;
  for (int i = 0; i < o; i++) X[i] = 0;
  for (int i = 0; i < n; i++) X[i] = A[i];
  NTT(X, Y, 0, o, 1);
  for (int i = 0; i < o; i++) X[i] = 0;
  for (int i = 0; i < n; i++) X[i] = B[i];
  NTT(X, Z, 0, o, 1);
  for (int i = 0; i < o; i++)
    Z[i] = (long long)Y[i] * Z[i] % 998244353 * Z[i] % 998244353;
  for (int i = 1; i * 2 <= o; i++) swap(w[i], w[o - i]);
  NTT(Z, C, 0, o, 1);
  for (int i = 0; i < o; i++) C[i] = (long long)C[i] * ni % 998244353;
}
void sqr(int *A, int *B, int n) {
  int o = 1;
  while (o < n) o *= 2;
  o *= 2;
  int t = mi(3, (998244353 - 1) / o), ni = mi(o, 998244353 - 2);
  w[0] = 1;
  for (int i = 1; i <= o; i++) w[i] = (long long)w[i - 1] * t % 998244353;
  for (int i = 0; i < o; i++) X[i] = 0;
  for (int i = 0; i < n; i++) X[i] = A[i];
  NTT(X, Y, 0, o, 1);
  for (int i = 0; i < o; i++) Y[i] = (long long)Y[i] * Y[i] % 998244353;
  for (int i = 1; i * 2 <= o; i++) swap(w[i], w[o - i]);
  NTT(Y, B, 0, o, 1);
  for (int i = 0; i < o; i++) B[i] = (long long)B[i] * ni % 998244353;
}
void sqrt(int n) {
  if (n == 1) {
    b[0] = c[0] = 1;
    return;
  }
  sqrt((n + 1) / 2);
  sqr(b, e, n);
  Q(c, e, d, n);
  for (int i = 0; i < n; i++)
    d[i] = ((long long)b[i] * 2 - d[i] + 998244353) % 998244353;
  Q(a, d, d, n);
  for (int i = 0; i < n; i++)
    c[i] = (998244353 + 1) / 2 * ((long long)c[i] + d[i]) % 998244353;
  Q(c, e, d, n);
  for (int i = 0; i < n; i++)
    b[i] = ((long long)b[i] * 2 - d[i] + 998244353) % 998244353;
}
void inv(int n) {
  if (n == 1) {
    b[0] = mi(a[0], 998244353 - 2);
    return;
  }
  inv((n + 1) / 2);
  A(a, b, d, n);
  for (int i = 0; i < n; i++)
    b[i] = ((long long)b[i] * 2 - d[i] + 998244353) % 998244353;
}
int main() {
  cin >> n >> m;
  a[0] = 1;
  while (n--) scanf("%d", &x), a[x] = 998244353 - 4;
  sqrt(m + 1);
  c[0]++;
  memcpy(a, c, sizeof(a));
  memset(b, 0, sizeof(b));
  inv(m + 1);
  for (int i = 1; i <= m; i++) printf("%d\n", b[i] * 2 % 998244353);
}