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 << 19) + 5;
const int mo = 998244353;
int R[N], B[N], n, m, LEN;
int A[N], Sqrt[N], Inv[N];
int power(int x, int y) {
  int s = 1;
  for (; y; y /= 2, x = 1ll * x * x % mo)
    if (y & 1) s = 1ll * s * x % mo;
  return s;
}
void FFTinit(int n) {
  LEN = 1;
  int L = 0;
  for (; LEN < n; LEN <<= 1, L++)
    ;
  for (int i = (int)(0); i <= (int)(LEN - 1); i++)
    R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1));
}
void FFT(int *a, int n, int f) {
  for (int i = (int)(0); i <= (int)(n - 1); i++)
    if (i < R[i]) swap(a[i], a[R[i]]);
  for (int d = 1; d < n; d <<= 1) {
    int wn = power(3, (mo - 1) / (d << 1));
    if (f == -1) wn = power(wn, mo - 2);
    for (int i = 0; i < n; i += (d << 1))
      for (int j = i, w = 1; j < i + d; j++) {
        int y = 1ll * a[j + d] * w % mo;
        a[j + d] = (a[j] + mo - y) % mo;
        a[j] = (a[j] + y) % mo;
        w = 1ll * w * wn % mo;
      }
  }
  if (f == -1) {
    int v = power(n, mo - 2);
    for (int i = (int)(0); i <= (int)(n - 1); i++) a[i] = 1ll * a[i] * v % mo;
  }
}
void getINV(int n) {
  if (n == 1) {
    Inv[0] = power(Sqrt[0], mo - 2);
    Inv[1] = 0;
    return;
  }
  getINV((n + 1) / 2);
  FFTinit(n * 2);
  for (int i = (int)(0); i <= (int)(LEN - 1); i++)
    if (i < n)
      B[i] = Sqrt[i];
    else
      B[i] = Inv[i] = 0;
  FFT(B, LEN, 1);
  FFT(Inv, LEN, 1);
  for (int i = (int)(0); i <= (int)(LEN - 1); i++)
    Inv[i] = 1ll * Inv[i] * (2 + mo - 1ll * B[i] * Inv[i] % mo) % mo;
  FFT(Inv, LEN, -1);
  for (int i = (int)(n); i <= (int)(LEN - 1); i++) Inv[i] = 0;
}
void getSQRT(int n) {
  if (n == 1) {
    Sqrt[0] = 1;
    return;
  }
  getSQRT((n + 1) / 2);
  getINV(n);
  FFTinit(n * 2);
  for (int i = (int)(0); i <= (int)(LEN - 1); i++) B[i] = (i < n ? A[i] : 0);
  FFT(B, LEN, 1);
  FFT(Inv, LEN, 1);
  for (int i = (int)(0); i <= (int)(LEN - 1); i++)
    B[i] = 1ll * B[i] * Inv[i] % mo;
  FFT(B, LEN, -1);
  for (int i = (int)(0); i <= (int)(n - 1); i++)
    Sqrt[i] = 1ll * (Sqrt[i] + B[i]) * (mo + 1) / 2 % mo;
}
int main() {
  scanf("%d%d", &n, &m);
  m++;
  for (int i = (int)(1); i <= (int)(n); i++) {
    int x;
    scanf("%d", &x);
    A[x] = (A[x] + mo - 4) % mo;
  }
  A[0] = 1;
  getSQRT(m);
  Sqrt[0]++;
  getINV(m);
  for (int i = (int)(1); i <= (int)(m - 1); i++)
    printf("%d\n", Inv[i] * 2 % mo);
}