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 rev[262145], c[262145], g[262145], f[262145], A[262145], B[262145],
    C[262145], d[262145], w[2][262145];
int N, n, m, i, x;
inline int Pow(int a, int b) {
  int res = 1;
  for (; b; b >>= 1, a = a * 1ll * a % 998244353)
    if (b & 1) res = res * 1ll * a % 998244353;
  return res;
}
inline void NTT(int *a, int o) {
  for (int i = 0; i < N; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int i = 1; i < N; i <<= 1)
    for (int j = 0, t = N / (i << 1); j < N; j += i << 1)
      for (int k = 0, l = 0; k < i; k++, l += t) {
        int x = a[j + k + i] * 1ll * w[o][l] % 998244353;
        int y = a[j + k];
        a[j + k + i] = y - x < 0 ? y - x + 998244353 : y - x;
        a[j + k] = y + x >= 998244353 ? y + x - 998244353 : y + x;
      }
  if (o) {
    int x = Pow(N, 998244353 - 2);
    for (int i = 0; i < N; i++) a[i] = a[i] * 1ll * x % 998244353;
  }
}
inline void CONV(int *A, int *B, int *C, int N_tmp) {
  for (N = 1; N <= N_tmp; N <<= 1)
    ;
  N <<= 1;
  for (int i = N_tmp + 1; i < N; i++) A[i] = B[i] = C[i] = 0;
  for (int i = 0; i < N; i++) {
    int x = i, &y = rev[i];
    y = 0;
    for (int k = 1; k < N; k <<= 1, x >>= 1) (y <<= 1) |= x & 1;
  }
  int x = Pow(3, (998244353 - 1) / N), y = Pow(x, 998244353 - 2);
  w[0][0] = w[1][0] = 1;
  for (int i = 1; i < N; i++)
    w[0][i] = w[0][i - 1] * 1ll * x % 998244353,
    w[1][i] = w[1][i - 1] * 1ll * y % 998244353;
  NTT(A, 0);
  NTT(B, 0);
  NTT(C, 0);
  for (int i = 0; i < N; i++)
    C[i] = A[i] * 1ll * B[i] % 998244353 * 1ll * C[i] % 998244353;
  NTT(C, 1);
}
void solve(int l, int r) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  solve(l, mid);
  for (int i = 0; i <= r - l; i++) A[i] = B[i] = 0, C[i] = g[i];
  for (int i = l; i <= mid; i++) A[i - l] = f[i];
  for (int i = 0; i <= r - l && i <= mid; i++)
    B[i] = (i < l) ? (f[i] * 2ll % 998244353) : f[i];
  CONV(A, B, C, r - l);
  for (int i = mid + 1; i <= r; i++) (f[i] += C[i - l]) %= 998244353;
  solve(mid + 1, r);
}
int main() {
  scanf("%d%d", &m, &n);
  for (i = 1; i <= m; i++) scanf("%d", &x), g[x] = 1;
  f[0] = 1;
  solve(0, n);
  for (i = 1; i <= n; i++) printf("%d\n", f[i]);
}