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 = 1 << 18 | 1, M = 998244353;
int a[N], A[N], B[N], C[N], n, m, f[N], x;
inline int ksm(int x, int y) {
  int ans = 1;
  for (; y; y >>= 1, x = (long long)x * x % M)
    if (y & 1) ans = (long long)ans * x % M;
  return ans;
}
void init(int y[], int len) {
  for (int i = 1, j = len / 2; i < len - 1; i++) {
    if (i < j) swap(y[i], y[j]);
    int k = len / 2;
    while (j >= k) {
      j -= k;
      k /= 2;
    }
    j += k;
  }
}
void ntt(int y[], int len, int opt) {
  init(y, len);
  for (int h = 2; h <= len; h <<= 1) {
    int wn = ksm(3, (M - 1) / h);
    if (opt == -1) wn = ksm(wn, M - 2);
    for (int j = 0; j < len; j += h) {
      int w = 1;
      for (int k = j; k < j + h / 2; k++) {
        int u = y[k], v = (long long)y[k + h / 2] * w % M;
        y[k] = (u + v) % M;
        y[k + h / 2] = (M + u - v) % M;
        w = (long long)w * wn % M;
      }
    }
  }
  if (opt == 1) return;
  int temp = ksm(len, M - 2);
  for (int i = 0; i < len; i++) y[i] = (long long)y[i] * temp % M;
}
void solve(int l, int r) {
  if (l == r) {
    (f[l] += a[l]) %= M;
    return;
  }
  int mid = (l + r) / 2;
  solve(l, mid);
  if (l == 0) {
    int len = 1;
    while (len <= (mid - l) * 3) len <<= 1;
    for (int i = 0; i <= mid; i++) A[i] = f[i];
    for (int i = 0; i <= mid; i++) B[i] = a[i];
    ntt(B, len, 1);
    ntt(A, len, 1);
    for (int i = 0; i < len; i++) A[i] = (long long)A[i] * B[i] % M * A[i] % M;
    ntt(A, len, -1);
    for (int i = mid + 1; i <= r; i++) (f[i] += A[i]) %= M;
    for (int i = 0; i < len; i++) A[i] = B[i] = 0;
  } else {
    int len = 1;
    while (len <= 2 * (r - l) + mid - l) len <<= 1;
    for (int i = l; i <= mid; i++) A[i - l] = f[i];
    for (int i = 0; i <= r - l; i++) B[i] = a[i], C[i] = f[i];
    ntt(B, len, 1);
    ntt(A, len, 1);
    ntt(C, len, 1);
    for (int i = 0; i < len; i++)
      A[i] = (long long)A[i] * B[i] % M * C[i] * 2 % M;
    ntt(A, len, -1);
    for (int i = mid + 1; i <= r; i++) (f[i] += A[i - l]) %= M;
    for (int i = 0; i < len; i++) A[i] = B[i] = C[i] = 0;
    len = 1;
    while (len <= 2 * (r - l) + mid - l) len <<= 1;
    for (int i = l; i <= mid; i++) A[i - l] = a[i];
    for (int i = 0; i <= r - l; i++) B[i] = f[i], C[i] = f[i];
    ntt(B, len, 1);
    ntt(A, len, 1);
    ntt(C, len, 1);
    for (int i = 0; i < len; i++) A[i] = (long long)A[i] * B[i] % M * C[i] % M;
    ntt(A, len, -1);
    for (int i = mid + 1; i <= r; i++) (f[i] += A[i - l]) %= M;
    for (int i = 0; i < len; i++) A[i] = B[i] = C[i] = 0;
  }
  solve(mid + 1, r);
}
int main() {
  f[0] = 1;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    a[x]++;
  }
  solve(0, m);
  for (int i = 1; i <= m; i++) printf("%d\n", f[i]);
  return 0;
}