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 mod = 998244353, R = 3;
const int N = 3e5 + 7;
int n, m, inv2 = 499122177, invR = 332748118;
int A[N], B[N], C[N], D[N], F[N], G[N], r[N], w[N];
int qread() {
  int x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x;
}
int Fpow(long long b, int p) {
  long long res = 1;
  for (; p; p >>= 1, b = b * b % mod)
    if (p & 1) res = res * b % mod;
  return res;
}
void NTT(int *a, int len, int opt) {
  int lim = 1, l = -1;
  while (lim < len) lim <<= 1, l++;
  for (int i = 1; i < lim; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << l);
  for (int i = 1; i < lim; i++)
    if (i < r[i]) swap(a[i], a[r[i]]);
  for (int i = 2; i <= lim; i <<= 1) {
    int mid = i >> 1, Wn = Fpow(~opt ? R : invR, (mod - 1) / i), t;
    w[0] = 1;
    for (int j = 1; j < mid; j++) w[j] = 1ll * w[j - 1] * Wn % mod;
    for (int j = 0; j < lim; j += i)
      for (int k = j; k < j + mid; k++) {
        t = 1ll * w[k - j] * a[k + mid] % mod;
        a[k + mid] = (a[k] - t + mod) % mod;
        a[k] = (a[k] + t) % mod;
      }
  }
  if (opt == -1)
    for (int i = 0, inv = Fpow(lim, mod - 2); i < lim; i++)
      a[i] = 1ll * a[i] * inv % mod;
}
void Getinv(int *f, int *g, int len) {
  if (len == 1) {
    g[0] = Fpow(f[0], mod - 2);
    return;
  }
  Getinv(f, g, len >> 1);
  for (int i = 0; i < len; i++) A[i] = f[i], B[i] = g[i];
  NTT(A, len << 1, 1);
  NTT(B, len << 1, 1);
  for (int i = 0; i < (len << 1); i++)
    A[i] = 1ll * A[i] * B[i] % mod * B[i] % mod;
  NTT(A, len << 1, -1);
  for (int i = 0; i < len; i++) g[i] = (g[i] * 2 % mod - A[i] + mod) % mod;
  for (int i = 0; i < (len << 1); i++) A[i] = B[i] = 0;
}
void Getsqrt(int *f, int *g, int len) {
  if (len == 1) {
    g[0] = sqrt(f[0]);
    return;
  }
  Getsqrt(f, g, len >> 1);
  for (int i = 0; i < len; i++) C[i] = f[i];
  Getinv(g, D, len);
  NTT(C, len << 1, 1);
  NTT(D, len << 1, 1);
  for (int i = 0; i < (len << 1); i++) C[i] = 1ll * C[i] * D[i] % mod;
  NTT(C, len << 1, -1);
  for (int i = 0; i < len; i++) g[i] = 1ll * (g[i] + C[i]) % mod * inv2 % mod;
  for (int i = 0; i < (len << 1); i++) C[i] = D[i] = 0;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) F[qread()]++;
  int len = 1;
  while (len <= m) len <<= 1;
  for (int i = 1; i < len; i++) F[i] = (-4 * F[i] + mod) % mod;
  F[0]++;
  Getsqrt(F, G, len);
  G[0]++;
  memset(F, 0, sizeof(F));
  Getinv(G, F, len);
  for (int i = 1; i <= m; i++) printf("%d\n", (F[i] + F[i]) % mod);
  return 0;
}