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;
namespace Base {
const int inf = 0x3f3f3f3f, INF = 0x7fffffff;
const long long infll = 0x3f3f3f3f3f3f3f3fll, INFll = 0x7fffffffffffffffll;
template <typename T>
void read(T &x) {
  x = 0;
  int fh = 1;
  double num = 1.0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  if (ch == '.') {
    ch = getchar();
    while (isdigit(ch)) {
      num /= 10;
      x = x + num * (ch - '0');
      ch = getchar();
    }
  }
  x = x * fh;
}
template <typename T>
void chmax(T &x, T y) {
  x = x < y ? y : x;
}
template <typename T>
void chmin(T &x, T y) {
  x = x > y ? y : x;
}
}  // namespace Base
using namespace Base;
const int N = 1000100;
namespace Poly {
const int P = 998244353, G = 3, K = 20;
const int SZ = sizeof(int);
static int tmp[K][N];
int top;
int power(int x, int y) {
  int i = x;
  x = 1;
  while (y > 0) {
    if (y % 2 == 1) x = 1ll * i * x % P;
    i = 1ll * i * i % P;
    y /= 2;
  }
  return x;
}
int arrpush() { return top++; }
void arrpop(int l) {
  memset(tmp[top - 1], 0, SZ * l);
  top--;
}
int mul2(int x) {
  int i = 1;
  while (x > i) i <<= 1;
  return i;
}
void NTT(int *a, int l, int tag) {
  for (int i = 0, j = 0; i < l; i++) {
    if (i > j) swap(a[i], a[j]);
    for (int k = (l >> 1); (j ^= k) < k; k >>= 1)
      ;
  }
  for (int i = 1; i < l; i <<= 1) {
    int wn = power(G, (P - 1) / (i * 2));
    if (tag == -1) wn = power(wn, P - 2);
    for (int j = 0; j < l; j += i + i) {
      int w = 1;
      for (int k = 0; k < i; k++, w = 1ll * w * wn % P) {
        int x = a[k + j], y = 1ll * w * a[k + j + i] % P;
        a[k + j] = (x + y) % P, a[k + j + i] = (x - y + P) % P;
      }
    }
  }
  if (tag == -1) {
    int in = power(l, P - 2);
    for (int i = 0; i < l; i++) a[i] = 1ll * a[i] * in % P;
  }
}
void polyplus(int *a, int *b, int l) {
  for (int i = 0; i < l; i++) a[i] = (a[i] + b[i]) % P;
}
void polyminus(int *a, int *b, int l) {
  for (int i = 0; i < l; i++) a[i] = (a[i] - b[i] + P) % P;
}
void polytimesint(int *a, long long b, int l) {
  for (int i = 0; i < l; i++) a[i] = (a[i] * b) % P;
}
void polytimes(int *a, int la, int *b, int lb, int tol) {
  int l = mul2(la + lb), f1 = arrpush(), f2 = arrpush();
  memcpy(tmp[f1], a, SZ * la);
  memcpy(tmp[f2], b, SZ * lb);
  NTT(tmp[f1], l, 1);
  NTT(tmp[f2], l, 1);
  for (int i = 0; i < l; i++) tmp[f1][i] = (1ll * tmp[f1][i] * tmp[f2][i]) % P;
  NTT(tmp[f1], l, -1);
  for (int i = 0; i < tol; i++) a[i] = tmp[f1][i];
  arrpop(l);
  arrpop(l);
}
void polyinv(int *a, int l) {
  if (a[0] == 0) {
    cerr << "error in polyinv: the constant's inv doesn't exist." << endl;
    exit(-1);
  }
  l = mul2(l);
  int k = 1, f1 = arrpush(), f2 = arrpush(), f3 = arrpush();
  tmp[f1][0] = power(a[0], P - 2);
  while (k != l) {
    k = k * 2;
    for (int i = 0; i < k; i++) tmp[f2][i] = 2 * tmp[f1][i] % P;
    for (int i = 0; i < k; i++) tmp[f3][i] = a[i];
    polytimes(tmp[f3], k, tmp[f1], k, k);
    polytimes(tmp[f3], k, tmp[f1], k, k);
    for (int i = 0; i < k; i++) tmp[f2][i] = (tmp[f2][i] - tmp[f3][i] + P) % P;
    swap(f1, f2);
    memset(tmp[f2], 0, SZ * k);
    memset(tmp[f3], 0, SZ * k);
  }
  for (int i = 0; i < l; i++) a[i] = tmp[f1][i];
  arrpop(l);
  arrpop(l);
  arrpop(l);
}
void polyder(int *a, int l) {
  for (int i = 0; i < l - 1; i++) a[i] = 1ll * (i + 1) * a[i + 1] % P;
  a[l - 1] = 0;
}
void polyint(int *a, int l) {
  for (int i = l - 1; i > 0; i--) a[i] = 1ll * power(i, P - 2) * a[i - 1] % P;
  a[0] = 0;
}
void polyln(int *a, int l) {
  if (a[0] != 1) {
    cerr << "error in polyln : the constant is not 1." << endl;
    exit(-1);
  }
  l = mul2(l);
  int f1 = top++;
  memcpy(tmp[f1], a, SZ * l);
  polyder(tmp[f1], l);
  polyinv(a, l);
  polytimes(a, l, tmp[f1], l, l);
  polyint(a, l);
  memset(tmp[f1], 0, SZ * l);
  top--;
}
void polyexp(int *a, int l) {
  if (a[0] != 0) {
    cerr << "error in polyexp : the constant is not 0." << endl;
    exit(-1);
  }
  l = mul2(l);
  int k = 1, f1 = arrpush(), f2 = arrpush(), f3 = arrpush();
  tmp[f1][0] = 1;
  while (k != l) {
    k <<= 1;
    for (int i = 0; i < k; i++) tmp[f2][i] = tmp[f1][i];
    polyln(tmp[f2], k);
    polyminus(tmp[f2], a, k);
    polytimes(tmp[f2], k, tmp[f1], k, k);
    polyminus(tmp[f2], tmp[f1], k);
    polytimesint(tmp[f2], P - 1, k);
    swap(f1, f2);
  }
  for (int i = 0; i < l; i++) a[i] = tmp[f1][i];
  arrpop(l), arrpop(l);
}
void polypowWeak(int *a, int y, int l) {
  l = mul2(l);
  polyln(a, l);
  polytimesint(a, y, l);
  polyexp(a, l);
}
void polypowStrong(int *a, int *b, int l, int lb) {
  int k = 0;
  long long k1 = 0, k2 = 0, fg = 0;
  for (int i = lb - 1; i >= 0; i--) {
    k1 = k1 * 10 + b[i];
    if (k1 >= P) fg = 1;
    k1 %= P;
    k2 = (k2 * 10 + b[i]) % (P - 1);
  }
  while (k < l && a[k] == 0) k++;
  if (k > 0 && (1ll * k * k1 >= l || fg > 0)) {
    memset(a, 0, SZ * l);
    return;
  }
  int t = a[k], in = power(t, P - 2);
  polytimesint(a, in, l);
  polypowWeak(a + k, k1, l);
  int f1 = arrpush();
  for (int i = k * k1; i < l; i++) tmp[f1][i] = a[i - (k * k1) + k];
  for (int i = 0; i < l; i++) a[i] = tmp[f1][i];
  t = power(t, k2);
  polytimesint(a, t, l);
  arrpop(l);
}
}  // namespace Poly
using namespace Poly;
int n, m, a[N], b[N], c[N], l;
int main() {
  read(n);
  read(m);
  for (int i = 1; i <= n; i++) {
    int x;
    read(x);
    if (x <= m) a[x] = 1;
  }
  l = mul2(m + 1);
  memcpy(b, a, SZ * l);
  polytimesint(b, 4 * (P - 1ll) % P, l);
  b[0] = (b[0] + 1) % P;
  polypowWeak(b, power(2, P - 2), l);
  b[0] = (b[0] + 1) % P;
  polyinv(b, l);
  polytimesint(b, 2, l);
  for (int i = 1; i <= m; i++) printf("%d%c", b[i], (i == m) ? '\n' : '\n');
}