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 MAXN = 100005;
const long long Mod = 998244353;
const long long pmr = 3;
long long fp(long long a, long long k) {
  if (k < 0) a = fp(a, Mod - 2), k = -k;
  long long res = 1;
  while (k) {
    if (k & 1) (res *= a) %= Mod;
    (a *= a) %= Mod;
    k >>= 1;
  }
  return res;
}
void change(long long y[], int len) {
  for (int i = 1, j = len / 2; i < len - 1; i++) {
    if (i < j) swap(y[i], y[j]);
    int k = len / 2;
    while (j >= k) {
      j -= k;
      k /= 2;
    }
    if (j < k) j += k;
  }
}
long long x1[MAXN << 2], x2[MAXN << 2];
void fft(long long y[], int len, int on) {
  change(y, len);
  for (int h = 2; h <= len; h <<= 1) {
    long long wn = fp(pmr, -on * (Mod - 1) / h);
    for (int j = 0; j < len; j += h) {
      long long w = 1;
      for (int k = j; k < j + h / 2; k++) {
        long long u = y[k];
        long long v = w * y[k + h / 2] % Mod;
        y[k] = (u + v) % Mod;
        y[k + h / 2] = (u - v + Mod) % Mod;
        (w *= wn) %= Mod;
      }
    }
  }
  if (on == -1) {
    long long tmp = fp(len, -1);
    for (int i = 0; i < len; i++) (y[i] *= tmp) %= Mod;
  }
}
long long f[MAXN], g[MAXN];
void solve(int l, int r) {
  if (l + 1 == r) return;
  int m = (l + r) / 2;
  solve(l, m);
  int k = 1;
  while (k <= r - l) k <<= 1;
  if (r - l <= l)
    for (int i = 0; i < k; i++) {
      x1[i] = (i + l < r ? 2 * f[i] % Mod : 0);
      x2[i] = (i + l < m ? f[i + l] : 0);
    }
  else
    for (int i = 0; i < k; i++) x1[i] = x2[i] = (i + l < m ? f[i + l] : 0);
  fft(x1, k, 1);
  fft(x2, k, 1);
  for (int i = 0; i < k; i++) (x1[i] *= x2[i]) %= Mod;
  fft(x1, k, -1);
  for (int i = 0; i < k; i++) {
    x1[i] = (i + l < r ? x1[i] : 0);
    x2[i] = (i + l < r ? g[i] : 0);
  }
  fft(x1, k, 1);
  fft(x2, k, 1);
  for (int i = 0; i < k; i++) (x1[i] *= x2[i]) %= Mod;
  fft(x1, k, -1);
  for (int i = m; i < r; i++) (f[i] += x1[i - l]) %= Mod;
  solve(m, r);
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int c;
    scanf("%d", &c);
    g[c] = 1;
  }
  int t = 1;
  while (t <= m) t <<= 1;
  f[0] = 1;
  solve(0, t);
  for (int i = 1; i <= m; i++) printf("%I64d\n", f[i]);
  return 0;
}