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, prt = 3;
int n, m, a[800001], b[800001];
long long fpm(long long a, long long b, long long mod) {
  long long ret = 1, res = a;
  for (; b; b >>= 1) {
    if (b & 1) ret = ret * res % mod;
    res = res * res % mod;
  }
  return ret;
}
int getlen(int x) {
  int len = 1;
  for (; len < x; len <<= 1)
    ;
  len <<= 1;
  return len;
}
void DFT(int *a, int n, int f) {
  for (int i = 0, j = 0; i < n; i++) {
    if (i > j) swap(a[i], a[j]);
    for (int t = n >> 1; (j ^= t) < t; t >>= 1)
      ;
  }
  for (int i = 2; i <= n; i <<= 1)
    for (int j = 0,
             wm = fpm(prt, f == 1 ? (mod - 1) / i : (mod - 1) / i * (i - 1),
                      mod);
         j < n; j += i)
      for (int k = 0, w = 1; k < (i >> 1); k++) {
        int tmp = (long long)a[j + k + (i >> 1)] * w % mod;
        a[j + k + (i >> 1)] = (a[j + k] - tmp + mod) % mod;
        a[j + k] = (a[j + k] + tmp) % mod;
        w = (long long)w * wm % mod;
      }
  if (f == 1)
    for (int i = 0; i < n; i++)
      a[i] = (long long)a[i] * fpm(n, mod - 2, mod) % mod;
}
void getinv(int *a, int *b, int n) {
  static int tmp[800001];
  for (int i = 0; i < n; i++) b[i] = 0;
  b[0] = fpm(a[0], mod - 2, mod);
  for (int c = 1; c <= n; c <<= 1) {
    int l = getlen(c);
    for (int i = 0; i < c; i++) tmp[i] = a[i];
    memset(tmp + c + 1, 0, sizeof(int) * (l - c));
    DFT(tmp, l, 0);
    DFT(b, l, 0);
    for (int i = 0; i < l; i++)
      b[i] = (long long)b[i] * (2 - (long long)tmp[i] * b[i] % mod + mod) % mod;
    DFT(b, l, 1);
    memset(b + c + 1, 0, sizeof(int) * (l - c));
  }
}
void getsqrt(int *a, int *b, int n) {
  static int tmp[800001], ta[800001];
  int r = fpm(2, mod - 2, mod);
  b[0] = 1;
  b[1] = 0;
  for (int c = 1; c <= n; c <<= 1) {
    getinv(b, tmp, c);
    int l = getlen(c);
    memcpy(ta, a, sizeof(int) * c);
    DFT(tmp, l, 0);
    DFT(ta, l, 0);
    for (int i = 0; i < l; i++) tmp[i] = (long long)ta[i] * tmp[i] % mod;
    DFT(tmp, l, 1);
    for (int i = 0; i < c; i++)
      b[i] = (long long)(tmp[i] + b[i]) % mod * r % mod;
  }
}
inline int getint() {
  int ret = 0;
  char ch = 'A';
  for (; ch < '0' || ch > '9'; ch = getchar())
    ;
  for (; '0' <= ch && ch <= '9'; ch = getchar()) ret = ret * 10 + ch - '0';
  return ret;
}
int main() {
  n = getint();
  m = getint();
  for (int i = a[0] = 1; i <= n; i++) a[getint()] = mod - 4;
  int l = getlen(m + 1) >> 1;
  getsqrt(a, b, l);
  b[0]++;
  getinv(b, a, l);
  for (int i = 1; i <= m; i++) printf("%d\n", (a[i] << 1) % mod);
  return 0;
}