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, r[400010];
unsigned long long F[400010], G[400010], H[400010], t[400010], tt[400010],
    ans[400010], W[400010], Inv[400010];
unsigned long long ksm(unsigned long long x, int y) {
  unsigned long long fin = 1;
  while (y) {
    if (y & 1) fin = fin * x % 998244353;
    x = x * x % 998244353, y >>= 1;
  }
  return fin;
}
unsigned long long pls(unsigned long long a, unsigned long long b) {
  return a + b > 998244353 ? a + b - 998244353 : a + b;
}
unsigned long long mnus(unsigned long long a, unsigned long long b) {
  return a > b ? a - b : a + 998244353 - b;
}
inline void getr(int lim, int d) {
  for (int i = 0; i < lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << d - 1);
}
inline void NTT(unsigned long long* A, int lim, int fl) {
  for (int i = 0; i < lim; i++)
    if (i < r[i]) swap(A[i], A[r[i]]);
  for (int i = 2; i <= lim; i <<= 1) {
    unsigned long long wn = ksm(3, (998244353 - 1) / i);
    if (fl == -1) wn = ksm(wn, 998244353 - 2);
    for (int j = 0; j < lim; j += i) {
      unsigned long long w = 1;
      for (int k = 0; k < i >> 1; k++) {
        unsigned long long x = A[j + k],
                           y = w * A[j + k + (i >> 1)] % 998244353;
        A[j + k] = pls(x, y), A[j + k + (i >> 1)] = mnus(x, y);
        w = w * wn % 998244353;
      }
    }
  }
  if (fl == -1) {
    unsigned long long inv = ksm(lim, 998244353 - 2);
    for (int i = 0; i < lim; i++) A[i] = A[i] * inv % 998244353;
  }
}
inline void INV(int len, unsigned long long* A, unsigned long long* B) {
  if (len == 1) {
    B[0] = ksm(A[0], 998244353 - 2);
    return;
  }
  INV(len >> 1, A, B);
  for (int i = 0; i < len; i++) t[i] = A[i];
  int x = len << 1, d = (int)log2(x);
  getr(x, d);
  NTT(t, x, 1), NTT(B, x, 1);
  for (int i = 0; i < x; i++)
    B[i] = B[i] * mnus(2, B[i] * t[i] % 998244353) % 998244353;
  NTT(B, x, -1);
  for (int i = len; i < x; i++) B[i] = 0;
}
inline void SQRT(int len, unsigned long long* A, unsigned long long* B) {
  if (len == 1) {
    B[0] = 1;
    return;
  }
  SQRT(len >> 1, A, B);
  memset(H, 0, sizeof(H));
  memset(t, 0, sizeof(t));
  for (int i = 0; i < len; i++) tt[i] = A[i];
  INV(len, B, H);
  int x = len << 1, d = (int)log2(x);
  getr(x, d);
  NTT(H, x, 1), NTT(tt, x, 1);
  for (int i = 0; i < x; i++) H[i] = H[i] * tt[i] % 998244353;
  NTT(H, x, -1);
  for (int i = 0; i < len; i++) B[i] = pls(H[i], B[i]) * 499122177 % 998244353;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int a;
    scanf("%d", &a);
    F[a] = 998244353 - 4;
  }
  F[0] = 1;
  int lim = 1;
  while (lim <= 100000) lim <<= 1;
  for (int i = 2; i <= lim; i <<= 1) W[i] = ksm(3, (998244353 - 1) / i);
  SQRT(lim, F, ans);
  ans[0]++;
  memset(F, 0, sizeof(F));
  memset(t, 0, sizeof(t));
  INV(lim, ans, F);
  for (int i = 1; i <= m; i++)
    printf("%lld\n", (F[i] * 2 % 998244353 + 998244353) % 998244353);
  return 0;
}