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 G = 3;
const int MAXN = 1e5;
int n, m, sz;
long long inv2;
long long s[MAXN << 2], f[MAXN << 2], g[MAXN << 2], rc[MAXN << 2];
long long Sqrt_use1[MAXN << 2], Sqrt_use2[MAXN << 2], Sqrt_inp[MAXN << 2],
    Sqrt_outp[MAXN << 2];
long long Inv_use[MAXN << 2], Inv_inp[MAXN << 2], Inv_outp[MAXN << 2];
int rat[MAXN << 2], len;
void Sqrt_pol(long long inp[], long long outp[], int lim);
void Inv_pol(long long inp[], long long outp[], int lim);
void Mul_pol(long long a[], long long b[]);
void get_rat();
void ra(long long f[]);
void NTT(long long f[], int t);
long long Sqr(long long, int);
int main() {
  int i, j;
  inv2 = Sqr(2, mod - 2);
  sz = sizeof(f);
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) {
    scanf("%d", &j);
    if (j <= m) (s[j] += mod - 4) %= mod;
  }
  s[0]++, s[0] %= mod;
  for (i = 0; i <= m; i++) Sqrt_inp[i] = s[i];
  Sqrt_pol(Sqrt_inp, Sqrt_outp, m + 1);
  for (i = 0; i <= m; i++) Inv_inp[i] = Sqrt_outp[i];
  Inv_inp[0]++, Inv_inp[0] %= mod;
  Inv_pol(Inv_inp, Inv_outp, m + 1);
  for (i = 0; i <= m; i++) f[i] = Inv_outp[i];
  for (i = 1; i <= m; i++) printf("%lld\n", (f[i] << 1) % mod);
  return 0;
}
void Sqrt_pol(long long inp[], long long outp[], int lim) {
  int det = 1, i;
  memset(outp, 0, sz);
  outp[0] = 1;
  for (det = 2; (det >> 1) < lim; det <<= 1) {
    for (i = 0; i < det; i++) Inv_inp[i] = outp[i];
    for (i = det; i < det << 1; i++) Inv_inp[i] = 0;
    Inv_pol(Inv_inp, Inv_outp, det);
    for (i = 0; i < det; i++) Sqrt_use1[i] = Inv_outp[i];
    for (i = 0; i < det; i++) Sqrt_use2[i] = inp[i];
    len = det << 1;
    for (i = det; i < len; i++) Sqrt_use1[i] = Sqrt_use2[i] = 0;
    Mul_pol(Sqrt_use1, Sqrt_use2);
    for (i = 0; i < det; i++) ((outp[i] += Sqrt_use1[i]) *= inv2) %= mod;
  }
  for (i = lim; i < det >> 1; i++) outp[i] = 0;
}
void Inv_pol(long long inp[], long long outp[], int lim) {
  int det = 1, i;
  memset(outp, 0, sz);
  memset(Inv_use, 0, sz);
  outp[0] = Sqr(inp[0], mod - 2);
  for (det = 2; (det >> 1) < lim; det <<= 1) {
    for (i = 0; i < det; i++) Inv_use[i] = inp[i];
    len = det << 1;
    for (i = det; i < len; i++) Inv_use[i] = 0;
    Mul_pol(Inv_use, outp);
    for (i = 0; i < det; i++) Inv_use[i] = (mod - Inv_use[i]) % mod;
    for (i = det; i < len; i++) Inv_use[i] = 0;
    (Inv_use[0] += 2) %= mod;
    NTT(Inv_use, 1);
    for (i = 0; i < len; i++) (outp[i] *= Inv_use[i]) %= mod;
    NTT(outp, -1);
    for (i = det; i < len; i++) outp[i] = 0;
  }
  for (i = lim; i < det >> 1; i++) outp[i] = 0;
}
void Mul_pol(long long a[], long long b[]) {
  int i;
  get_rat();
  rc[i = len] = Sqr(G, (mod - 1) / len);
  while (i) {
    rc[i >> 1] = rc[i] * rc[i] % mod;
    i >>= 1;
  }
  NTT(a, 1), NTT(b, 1);
  for (i = 0; i < len; i++) (a[i] *= b[i]) %= mod;
  NTT(a, -1);
}
void get_rat() {
  int i;
  rat[0] = 0;
  for (i = 1; i < len; i++) rat[i] = rat[i >> 1] >> 1 | (i & 1) * (len >> 1);
}
void ra(long long f[]) {
  int i;
  for (i = 0; i < len; i++)
    if (rat[i] > i) swap(f[rat[i]], f[i]);
}
void NTT(long long f[], int t) {
  long long f0, f1, inv;
  int i, j, k, lim;
  ra(f);
  for (k = 2; k <= len; k <<= 1) {
    lim = k >> 1;
    g[0] = 1, g[1] = rc[k];
    for (i = 2; i <= lim; i++) g[i] = g[i - 1] * g[1] % mod;
    for (i = 0; i < len; i += k)
      for (j = i; j < i + lim; j++) {
        f0 = f[j], f1 = f[j + lim] * g[j - i] % mod;
        f[j] = (f0 + f1) % mod, f[j + lim] = (f0 - f1 + mod) % mod;
      }
  }
  if (t < 0) {
    for (i = 1; i < len >> 1; i++) swap(f[i], f[len - i]);
    inv = Sqr(len, mod - 2);
    for (i = 0; i < len; i++) (f[i] *= inv) %= mod;
  }
}
long long Sqr(long long x, int n) {
  long long ret = 1;
  while (n) {
    if (n & 1) (ret *= x) %= mod;
    n >>= 1, (x *= x) %= mod;
  }
  return ret % mod;
}