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;
const long long inv2 = 499122177;
int n, m, x, T;
long long f[301000], g[2][301000], h[301000], t[301000], ta[301000];
int r[301000];
long long power(long long x, long long y) {
  long long res = 1;
  for (; y; y >>= 1, x = x * x % mod)
    if (y & 1) res = res * x % mod;
  return res;
}
long long inv(long long x) { return power(x, mod - 2); }
void init(int n) {
  T = n;
  for (int i = 0; i < T; i++) r[i] = r[i >> 1] >> 1 | ((i & 1) * (T >> 1));
  long long w = power(3, (mod - 1) / T);
  g[0][0] = g[0][T] = g[1][0] = g[1][T] = 1;
  for (int i = 1; i < T; i++) g[0][i] = g[0][i - 1] * w % mod;
  for (int i = 1; i < T; i++) g[1][i] = g[0][T - i];
}
void ntt(long long* a, int f) {
  for (int i = 0; i < T; i++)
    if (i < r[i]) swap(a[i], a[r[i]]);
  for (int i = 1; i < T; i <<= 1)
    for (int j = 0; j < T; j += i << 1)
      for (int k = 0; k < i; k++) {
        long long p = a[j + k], q = g[f][T / (i << 1) * k] * a[j + k + i] % mod;
        a[j + k] = (p + q) % mod;
        a[j + k + i] = (p - q + mod) % mod;
      }
  if (f)
    for (int i = 0; i < T; i++) a[i] = a[i] * inv(T) % mod;
}
void getinv(long long* a, long long* b, int n) {
  if (n == 1) {
    b[0] = inv(a[0]);
    return;
  }
  getinv(a, b, n >> 1);
  for (int i = 0; i < n; i++) ta[i] = a[i], ta[i + n] = 0;
  init(n << 1);
  ntt(b, 0);
  ntt(ta, 0);
  for (int i = 0; i < T; i++)
    b[i] = (2 * b[i] - ta[i] * b[i] % mod * b[i] % mod + mod) % mod;
  ntt(b, 1);
  for (int i = n; i < T; i++) b[i] = 0;
}
void getsqrt(long long* a, long long* b, int n) {
  if (n == 1) {
    b[0] = 1;
    return;
  }
  getsqrt(a, b, n >> 1);
  memset(t, 0, sizeof(long long) * (n << 1));
  getinv(b, t, n);
  for (int i = 0; i < n; i++) ta[i] = a[i], ta[i + n] = 0;
  init(n << 1);
  ntt(t, 0);
  ntt(ta, 0);
  ntt(b, 0);
  for (int i = 0; i < T; i++)
    b[i] = (b[i] * b[i] % mod + ta[i]) * t[i] % mod * inv2 % mod;
  ntt(b, 1);
  for (int i = n; i < T; i++) b[i] = 0;
}
int main() {
  scanf("%d%d", &n, &m);
  h[0] = 1;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    h[x] = (h[x] - 4 + mod) % mod;
  }
  for (n = 1; n <= m; n <<= 1)
    ;
  getsqrt(h, f, n);
  f[0] = (f[0] + 1) % mod;
  memcpy(h, f, sizeof(h));
  memset(f, 0, sizeof(f));
  getinv(h, f, n);
  for (int i = 1; i <= m; i++) printf("%lld\n", (f[i] << 1) % mod);
  return 0;
}