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;
long long I;
struct comp {
  long long x, y;
  comp(long long x = 0, long long y = 0) : x(x), y(y) {}
};
comp operator*(const comp a, const comp b) {
  comp c;
  c.x = ((a.x * b.x % 998244353 + I * a.y % 998244353 * b.y) % 998244353 +
         998244353) %
        998244353;
  c.y = (a.x * b.y % 998244353 + a.y * b.x % 998244353) % 998244353;
  return c;
}
bool operator==(const comp a, const comp b) { return a.x == b.x && a.y == b.y; }
long long power(long long a, long long x) {
  long long res = 1;
  while (x) {
    if (x & 1) res = (res * a) % 998244353;
    x >>= 1;
    a = (a * a) % 998244353;
  }
  return res;
}
comp power_comp(comp a, long long x) {
  comp res = comp(1, 0);
  while (x) {
    if (x & 1) res = res * a;
    x >>= 1;
    a = a * a;
  }
  return res;
}
bool check(long long x) {
  return power(x, (998244353 - 1) >> 1) == 998244353 - 1;
}
void Cipolla(long long n, long long &x, long long &y) {
  long long a = rand() % 998244353;
  n %= 998244353;
  if (check(n)) {
    x = y = -1;
    return;
  }
  while (a != 0 && !check((a * a % 998244353 + 998244353 - n) % 998244353))
    a = rand() % 998244353;
  I = (a * a % 998244353 + 998244353 - n) % 998244353;
  x = power_comp(comp(a, 1), (998244353 + 1) >> 1).x;
  y = 998244353 - x;
}
long long c[4194308], d[4194308], e[4194308], inv2;
int lim, r[4194308];
void ntt(long long *A, int rev) {
  for (int i = 0; i <= lim; i++)
    if (i < r[i]) swap(A[i], A[r[i]]);
  for (int mid = 1; mid < lim; mid <<= 1) {
    long long W =
        power(rev == 1 ? 3 : 332748118, (998244353 - 1) / (mid << 1)) %
        998244353;
    for (int i = 0; i < lim; i += (mid << 1)) {
      long long w = 1;
      for (int j = 0; j < mid; j++, w = w * W % 998244353) {
        long long x = A[i + j], y = w * A[i + j + mid] % 998244353;
        A[i + j] = (x + y) % 998244353;
        A[i + j + mid] = (x - y + 998244353) % 998244353;
      }
    }
  }
}
void inv(int n, long long *a, long long *b) {
  if (n == 1) {
    b[0] = power(a[0], 998244353 - 2);
    return;
  }
  inv((n + 1) >> 1, a, b);
  int i, l = 0;
  lim = 1;
  while (lim < 2 * n) {
    l++;
    lim <<= 1;
  }
  for (i = 1; i <= lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (i = 0; i <= lim; i++) c[i] = ((i < n) ? a[i] : 0);
  ntt(c, 1);
  ntt(b, 1);
  for (i = 0; i <= lim; i++)
    b[i] = (2 - c[i] * b[i] % 998244353 + 998244353) % 998244353 * b[i] %
           998244353;
  ntt(b, -1);
  long long inv = power(lim, 998244353 - 2);
  for (i = 0; i <= lim; i++) b[i] = b[i] * inv % 998244353;
  for (i = n; i <= lim; i++) b[i] = 0;
}
void sqrt(int n, long long *a, long long *b) {
  if (n == 1) {
    if (a[0] == 1) {
      b[0] = 1;
      return;
    }
    long long x, y;
    Cipolla(a[0], x, y);
    b[0] = min(x, y);
    return;
  }
  sqrt((n + 1) >> 1, a, b);
  int i, l = 0;
  for (i = 0; i <= n * 2; i++) e[i] = 0;
  inv(n, b, e);
  lim = 1;
  while (lim < 2 * n) {
    l++;
    lim <<= 1;
  }
  for (i = 1; i <= lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (i = 0; i <= lim; i++) d[i] = ((i < n) ? a[i] : 0);
  ntt(b, 1);
  ntt(d, 1);
  ntt(e, 1);
  for (i = 0; i <= lim; i++)
    b[i] = (b[i] + d[i] * e[i] % 998244353) * inv2 % 998244353;
  ntt(b, -1);
  long long invl = power(lim, 998244353 - 2);
  for (i = 0; i <= lim; i++) b[i] = b[i] * invl % 998244353;
  for (i = n; i <= lim; i++) b[i] = 0;
}
int n, m;
long long a[4194308], b[4194308], sq[4194308];
int main() {
  int i, j;
  scanf("%d%d", &n, &m);
  inv2 = power(2, 998244353 - 2);
  for (i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    a[x]++;
  }
  for (i = 1; i <= m; i++)
    a[i] = (998244353 - 4 * a[i] % 998244353) % 998244353;
  a[0]++;
  sqrt(m + 1, a, sq);
  sq[0] = (sq[0] + 1) % 998244353;
  inv(lim, sq, b);
  for (i = 1; i <= m; i++) printf("%lld\n", 2 * b[i] % 998244353);
  return 0;
}