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 long long mod = 998244353, div2 = 499122177;
long long a[300010], b[300010], ta[300010], tb[300010];
long long pow(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = ans * x % mod;
    x = x * x % mod, y >>= 1;
  }
  return ans;
}
void ntt(long long *a, int n, int flag) {
  int i, j, k;
  for (i = k = 0; i < n; i++) {
    if (i > k) swap(a[i], a[k]);
    for (j = n >> 1; (k ^= j) < j; j >>= 1)
      ;
  }
  for (k = 2; k <= n; k <<= 1) {
    long long wn = pow(3, (mod - 1) / k);
    if (flag == -1) wn = pow(wn, mod - 2);
    for (i = 0; i < n; i += k) {
      long long w = 1, t;
      for (j = i; j < i + (k >> 1); j++, w = w * wn % mod)
        t = w * a[j + (k >> 1)] % mod, a[j + (k >> 1)] = (a[j] - t + mod) % mod,
        a[j] = (a[j] + t) % mod;
    }
  }
  if (flag == -1) {
    k = pow(n, mod - 2);
    for (i = 0; i < n; i++) a[i] = a[i] * k % mod;
  }
}
void inv(long long *a, long long *b, int n) {
  if (n == 1) {
    b[0] = pow(a[0], mod - 2);
    return;
  }
  inv(a, b, n >> 1);
  int i;
  for (i = 0; i < n; i++) ta[i] = a[i];
  for (i = n; i < n << 1; i++) ta[i] = 0;
  ntt(ta, n << 1, 1), ntt(b, n << 1, 1);
  for (i = 0; i < n << 1; i++)
    b[i] = (b[i] * (2 - ta[i] * b[i] % mod) % mod + mod) % mod;
  ntt(b, n << 1, -1);
  for (i = n; i < n << 1; i++) b[i] = 0;
}
void sqrt(long long *a, long long *b, int n) {
  if (n == 1) {
    b[0] = 1;
    return;
  }
  sqrt(a, b, n >> 1);
  int i;
  for (i = 0; i < n << 1; i++) tb[i] = 0;
  inv(b, tb, n);
  for (i = 0; i < n; i++) ta[i] = a[i];
  for (i = n; i < n << 1; i++) ta[i] = 0;
  ntt(b, n << 1, 1), ntt(ta, n << 1, 1), ntt(tb, n << 1, 1);
  for (i = 0; i < n << 1; i++) b[i] = (b[i] + ta[i] * tb[i]) % mod * div2 % mod;
  ntt(b, n << 1, -1);
  for (i = n; i < n << 1; i++) b[i] = 0;
}
int main() {
  int n, m, i, x, len = 1;
  scanf("%d%d", &n, &m);
  while (len <= m) len <<= 1;
  for (i = 1; i <= n; i++) {
    scanf("%d", &x);
    if (x <= m) a[x]++;
  }
  for (i = 0; i < len; i++) a[i] = (mod - 4 * a[i] % mod) % mod;
  a[0]++;
  sqrt(a, b, len);
  b[0] = (b[0] + 1) % mod;
  for (i = 0; i < len; i++) a[i] = 0;
  inv(b, a, len);
  for (i = 1; i <= m; i++) printf("%lld\n", a[i] * 2 % mod);
  return 0;
}