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 inf = ~0U >> 1, maxn = 1 << 17, mod = 998244353, g = 3;
int pow(int a, int b, int p) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = 1LL * ret * a % p;
    b >>= 1;
    a = 1LL * a * a % p;
  }
  return ret;
}
void DFT(int *a, int n, int rev) {
  for (int i = 0; i < n; i++) {
    int y = i, x = 0;
    for (int j = 1; j < n; j <<= 1, y >>= 1) (x <<= 1) |= (y & 1);
    if (i > x) swap(a[i], a[x]);
  }
  for (int i = 2; i <= n; i <<= 1) {
    int wn = pow(pow(g, (mod - 1) / n, mod), n / i, mod),
        step = rev ? pow(wn, mod - 2, mod) : wn;
    for (int j = 0; j < n; j += i) {
      int cur = 1;
      for (int k = 0; k < i >> 1; k++) {
        int u = a[j + k], v = 1LL * a[j + k + (i >> 1)] * cur % mod;
        a[j + k] = (u + v) % mod;
        a[j + k + (i >> 1)] = (u - v + mod) % mod;
        cur = 1LL * cur * step % mod;
      }
    }
  }
  if (rev) {
    int inv = pow(n, mod - 2, mod);
    for (int i = 0; i < n; i++) a[i] = 1LL * a[i] * inv % mod;
  }
}
void getinv(int *a, int *b, int n) {
  static int c[maxn << 2];
  b[0] = pow(a[0], mod - 2, mod);
  for (int t = 2; t <= n; t <<= 1) {
    for (int i = 0; i < t; i++) c[i] = a[i];
    DFT(c, t << 1, 0);
    DFT(b, t << 1, 0);
    for (int i = 0; i < t << 1; i++)
      c[i] = (2 - 1LL * c[i] * b[i] % mod + mod) % mod;
    for (int i = 0; i < t << 1; i++) c[i] = 1LL * c[i] * b[i] % mod;
    DFT(c, t << 1, 1);
    for (int i = 0; i < t; i++) b[i] = c[i];
    for (int i = t; i < t << 1; i++) b[i] = 0;
    for (int i = 0; i < t << 1; i++) c[i] = 0;
  }
}
void getroot(int *a, int *b, int n) {
  static int rev[maxn << 2], c[maxn << 2];
  int inv = pow(2, mod - 2, mod);
  b[0] = rev[0] = 1;
  for (int t = 2; t <= n; t <<= 1) {
    getinv(b, rev, t);
    for (int i = 0; i < t; i++) c[i] = a[i];
    DFT(c, t << 1, 0);
    DFT(rev, t << 1, 0);
    for (int i = 0; i < t << 1; i++) {
      c[i] = 1LL * c[i] * rev[i] % mod;
      rev[i] = 0;
    }
    DFT(c, t << 1, 1);
    for (int i = 0; i < t; i++) b[i] = 1LL * (b[i] + c[i]) % mod * inv % mod;
  }
}
int main() {
  static int c[maxn << 2], res[maxn << 2];
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    c[x] = 1;
  }
  for (int i = 1; i <= m; i++) c[i] = (-4 * c[i] + mod) % mod;
  c[0] = 1;
  for (n = 1; n <= m; n <<= 1)
    ;
  getroot(c, res, n);
  for (int i = 0; i < n; i++) {
    c[i] = res[i];
    res[i] = 0;
  }
  c[0]++;
  getinv(c, res, n);
  for (int i = 1; i <= m; i++) printf("%d\n", (res[i] + res[i]) % mod);
}