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 = 1e5 + 10, mod = 998244353;
int n, f[N], g[N], m;
int fpow_(int a, int b, int res = 1) {
  for (; b; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1) res = 1ll * res * a % mod;
  return res;
}
namespace Poly {
int i2 = fpow_(2, mod - 2), i3 = fpow_(3, mod - 2), len, rev[1 << 20],
    A[1 << 20], B[1 << 20], C[1 << 20];
void ntt_(int *a, int op = 1) {
  for (int i = 0; i < len; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int i = 2; i <= len; i <<= 1) {
    int wn = fpow_(~op ? 3 : i3, (mod - 1) / i);
    for (int j = 0; j < len; j += i)
      for (int w = 1, k = 0; k < i / 2; k++) {
        int u = a[j + k], v = 1ll * a[j + k + i / 2] * w % mod;
        a[j + k] = (u + v) % mod, a[j + k + i / 2] = (u - v) % mod;
        w = 1ll * w * wn % mod;
      }
  }
  if (op == -1) {
    int inv = fpow_(len, mod - 2);
    for (int i = 0; i < len; i++) a[i] = 1ll * a[i] * inv % mod;
  }
}
void init_(int n, int k = 0) {
  for (len = 1; len <= n; len <<= 1, k++)
    ;
  for (int i = 0; i < len; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << k - 1);
}
void inv_(int *f, int *g, int n) {
  if (n == 1) {
    g[0] = fpow_(f[0], mod - 2);
    return;
  }
  int m = (n + 1) >> 1;
  inv_(f, g, m), init_(n << 1);
  for (int i = 0; i < len; i++)
    A[i] = i < n ? f[i] : 0, B[i] = i < m ? g[i] : 0;
  ntt_(A), ntt_(B);
  for (int i = 0; i < len; i++)
    A[i] = 1ll * B[i] * (2 - 1ll * A[i] * B[i] % mod) % mod;
  ntt_(A, -1);
  for (int i = 0; i < n; i++) g[i] = A[i];
}
void sqrt_(int *f, int *g, int n) {
  if (n == 1) {
    g[0] = 1;
    return;
  }
  int m = (n + 1) >> 1;
  sqrt_(f, g, m), inv_(g, C, n), init_(n << 1);
  for (int i = 0; i < len; i++) {
    A[i] = i < n ? f[i] : 0;
    B[i] = i < m ? g[i] : 0;
    C[i] = i < n ? 1ll * i2 * C[i] % mod : 0;
  }
  ntt_(A), ntt_(B), ntt_(C);
  for (int i = 0; i < len; i++)
    A[i] = 1ll * (A[i] + 1ll * B[i] * B[i] % mod) * C[i] % mod;
  ntt_(A, -1);
  for (int i = 0; i < n; i++) g[i] = A[i];
}
}  // namespace Poly
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, x; i <= n; i++) {
    scanf("%d", &x);
    if (x <= m) g[x] = mod - 4;
  }
  g[0] = 1;
  Poly ::sqrt_(g, f, m + 1), f[0]++;
  Poly ::inv_(f, g, m + 1);
  for (int i = 1; i <= m; i++) printf("%d\n", (2 * g[i] % mod + mod) % mod);
}