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>
inline int read() {
  int x = 0, sgn = 1;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') sgn = -1;
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * sgn;
}
namespace polynomial {
const int p = 998244353, g = 3;
inline void swap(int &x, int &y) { x ^= y ^= x ^= y; }
inline int power(int x, int y) {
  int s = 1;
  for (; y; y >>= 1, x = (long long)x * x % p)
    if (y & 1) s = (long long)s * x % p;
  return s;
}
inline void NTT(int *A, int len, int sgn) {
  for (int i = 1, j = len >> 1, k; i + 1 < len; i++) {
    if (i < j) swap(A[i], A[j]);
    for (k = len >> 1; j >= k; j ^= k, k >>= 1)
      ;
    if (j < k) j ^= k;
  }
  for (int i = 2; i <= len; i <<= 1) {
    int wn = power(g, sgn > 0 ? (p - 1) / i : (p - 1) - (p - 1) / i);
    for (int j = 0; j < len; j += i)
      for (int k = j, w = 1; k < j + (i >> 1); k++, w = (long long)w * wn % p) {
        int x = A[k], y = (long long)w * A[k + (i >> 1)] % p;
        A[k] = (x + y) % p, A[k + (i >> 1)] = (x - y + p) % p;
      }
  }
  if (sgn < 0) {
    int inv = power(len, p - 2);
    for (int i = 0; i < len; i++) A[i] = (long long)A[i] * inv % p;
  }
}
inline void Mul(int *A, int *B, int n, int *C) {
  int len = 1;
  while (len < n << 1) len <<= 1;
  NTT(A, len, 1);
  NTT(B, len, 1);
  for (int i = 0; i < len; i++) C[i] = (long long)A[i] * B[i] % p;
  NTT(C, len, -1);
}
int tmp1[1 << 18];
inline void Inv(int *A, int n, int *B) {
  int len = 1, *C = tmp1;
  while (len < n) len <<= 1;
  memset(B, 0, sizeof(int) * (len << 1));
  memset(C, 0, sizeof(int) * (len << 1));
  B[0] = power(A[0], p - 2);
  for (int i = 2; i <= len; i <<= 1) {
    memcpy(C, A, sizeof(int) * i);
    NTT(B, i << 1, 1);
    NTT(C, i << 1, 1);
    for (int k = 0; k < i << 1; k++)
      B[k] = (long long)B[k] * (p + 2 - (long long)B[k] * C[k] % p) % p;
    NTT(B, i << 1, -1);
    memset(B + i, 0, sizeof(int) * i);
  }
}
int tmp2[1 << 18], tmp3[1 << 18];
inline void Sqrt(int *A, int n, int *B) {
  int len = 1, *C = tmp2, *D = tmp3, inv2 = 499122177;
  while (len < n) len <<= 1;
  memset(B, 0, sizeof(int) * (len << 1));
  memset(C, 0, sizeof(int) * (len << 1));
  B[0] = 1;
  for (int i = 2; i <= len; i <<= 1) {
    memcpy(C, A, sizeof(int) * i);
    Inv(B, i, D);
    Mul(C, D, i, D);
    for (int k = 0; k < i; k++) B[k] = (long long)(B[k] + D[k]) * inv2 % p;
  }
}
}  // namespace polynomial
using namespace polynomial;
int A[1 << 18], B[1 << 18];
int main() {
  int n = read(), m = read();
  A[0] = 1;
  for (int i = 1; i <= n; i++) A[read()] = p - 4;
  Sqrt(A, m + 1, B);
  B[0]++;
  Inv(B, m + 1, A);
  for (int i = 1; i <= m; i++) printf("%d\n", (A[i] << 1) % p);
  return 0;
}