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 P = 998244353;
const int G = 3;
const int MAXN = (1 << 18) + 5;
inline int Pow(int a, int b) {
  int c = 1;
  for (; b; b >>= 1, a = a * 1ll * a % P)
    if (b & 1) c = c * 1ll * a % P;
  return c;
}
inline void FFT(int *a, int f, int N) {
  for (int i = (0); i <= (int)N - 1; i++) {
    int y = 0;
    int x = i;
    for (int k = 1; k < N; k <<= 1, x >>= 1) (y <<= 1) |= (x & 1);
    if (i < y) {
      int pa = a[i];
      a[i] = a[y];
      a[y] = pa;
    }
  }
  for (int i = 1; i < N; i <<= 1) {
    int step = Pow(G, (P - 1) / (i << 1));
    if (f) step = Pow(step, P - 2);
    for (int j = 0; j < N; j += (i << 1)) {
      int now = 1;
      for (int k = 0; k < i; k++) {
        int y = a[j + k];
        int x = a[j + k + i] * 1ll * now % P;
        a[j + k] = (x + y) % P;
        a[j + k + i] = (y - x + P) % P;
        now = now * 1ll * step % P;
      }
    }
  }
  if (f) {
    int dao = Pow(N, P - 2);
    for (int i = (0); i <= (int)N - 1; i++) a[i] = a[i] * 1ll * dao % P;
  }
}
inline void Juan(int *a, int *b, int *c, int n) {
  int N = 1;
  while (N <= n) N *= 2;
  N *= 2;
  for (int i = (n + 1); i <= (int)N - 1; i++) a[i] = b[i] = c[i] = 0;
  FFT(a, 0, N);
  FFT(b, 0, N);
  FFT(c, 0, N);
  for (int i = (0); i <= (int)N - 1; i++) {
    c[i] = c[i] * 1ll * a[i] % P;
    c[i] = c[i] * 1ll * b[i] % P;
  }
  FFT(c, 1, N);
}
int a[MAXN], b[MAXN], c[MAXN], f[MAXN];
int n, m;
int is[MAXN];
void work(int l, int r) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  work(l, mid);
  for (int i = (0); i <= (int)r - l; i++) a[i] = b[i] = c[i] = 0;
  for (int i = (0); i <= (int)r - l; i++) c[i] = is[i];
  for (int i = (0); i <= (int)r - l; i++) {
    if (i > mid) break;
    if (i < l)
      a[i] = f[i] * 2ll % P;
    else
      a[i] = f[i];
  }
  for (int i = (l); i <= (int)mid; i++) b[i - l] = f[i];
  Juan(a, b, c, r - l);
  for (int i = (mid + 1); i <= (int)r; i++) f[i] = (f[i] + c[i - l]) % P;
  work(mid + 1, r);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (int)n; i++) {
    int v;
    scanf("%d", &v);
    is[v] = 1;
  }
  f[0] = 1;
  work(0, m);
  for (int i = (1); i <= (int)m; i++) printf("%d\n", f[i]);
  return 0;
}