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;
int p = 998244353, n, m;
int rev[400005];
long long ksm(int x, int z) {
  if (!x) return 1;
  int ans = 1;
  while (z) {
    if (z & 1) {
      ans = 1ll * ans * x % p;
    }
    x = 1ll * x * x % p;
    z >>= 1;
  }
  return ans;
}
void fft(int *A, int n, int op) {
  int ttt;
  for (int i = 1; i < n; ++i) {
    if (rev[i] > i) {
      ttt = A[rev[i]];
      A[rev[i]] = A[i];
      A[i] = ttt;
    }
  }
  int len, x, y, w, wn;
  for (int k = 2; k <= n; k <<= 1) {
    len = k >> 1;
    wn = ksm(3, (op == 1) ? (p - 1) / k : (p - 1) - (p - 1) / k);
    for (int j = 0; j < n; j += k) {
      w = 1;
      for (int i = 0; i < len; ++i) {
        x = A[i + j], y = 1ll * A[i + j + len] * w % p;
        A[i + j] = (x + y) % p;
        A[i + j + len] = (x - y + p) % p;
        w = 1ll * w * wn % p;
      }
    }
  }
  if (op == -1) {
    int inv = ksm(n, p - 2);
    for (int i = 0; i < n; ++i) A[i] = 1ll * A[i] * inv % p;
  }
}
inline void get_inv(int *A, int *B, int n) {
  if (n == 1) {
    B[0] = ksm(A[0], p - 2);
    return;
  }
  get_inv(A, B, n >> 1);
  int len = n << 1, t = 1, l = 0;
  for (; t < len; t <<= 1, ++l)
    ;
  l--;
  for (int i = 1; i < t; ++i) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l);
  static int tmp[400005];
  for (int i = 0; i < n; ++i) tmp[i] = A[i];
  for (int i = n; i < t; ++i) tmp[i] = 0;
  fft(tmp, t, 1);
  fft(B, t, 1);
  for (int i = 0; i < len; ++i)
    B[i] = 1ll * B[i] * (2ll - 1ll * B[i] * tmp[i] % p + p) % p;
  fft(B, t, -1);
  for (int i = n; i < t; ++i) B[i] = 0;
}
long long inv2 = ksm(2, p - 2);
int C[400005];
inline void get_sqr(int *A, int *B, long long n) {
  if (n == 1) {
    B[0] = 1;
    return;
  }
  get_sqr(A, B, n >> 1);
  for (int i = 0; i < n; ++i) C[i] = 0;
  get_inv(B, C, n);
  int t = 1, l = 0, len = n << 1;
  for (; t < len; t <<= 1, l++)
    ;
  l--;
  for (int i = 1; i < t; ++i) rev[i] = (rev[i >> 1] >> 1) | ((1 & i) << l);
  static int tmp[400005];
  for (int i = 0; i < n; ++i) tmp[i] = A[i];
  for (int i = n; i < t; ++i) tmp[i] = 0;
  fft(tmp, t, 1);
  fft(C, t, 1);
  for (int i = 0; i < t; ++i) tmp[i] = 1ll * tmp[i] * C[i] % p;
  fft(tmp, t, -1);
  for (int i = 0; i < n; ++i)
    B[i] = 1ll * inv2 * ((long long)tmp[i] + (long long)B[i]) % p;
}
int a[400005], b[400005], c[400005], d[400005];
int main() {
  scanf("%d%d", &n, &m);
  int mx = 0;
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    if (x > m) continue;
    a[x]++;
    if (mx < x) mx = x;
  }
  for (int i = 0; i <= mx; ++i) {
    a[i] = (p + (i == 0) - (a[i] << 2) % p) % p;
  }
  int t, l;
  for (t = 1, l = 0; t <= m; t <<= 1, ++l)
    ;
  l--;
  get_sqr(a, b, t);
  b[0]++;
  b[0] %= p;
  get_inv(b, c, t);
  for (int i = 1; i <= m; ++i) printf("%lld\n", 1ll * (c[i] << 1ll) % p);
  return 0;
}