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;
const int LEN = 262144;
int Power(int x, int y) {
  int re = 1;
  while (y) {
    if (y & 1) re = 1ll * re * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return re;
}
void NTT(int a[], int len, int parameter) {
  for (int t = 0, i = 0; i < len; i++) {
    if (i < t) swap(a[i], a[t]);
    for (int j = len >> 1; (t ^= j) < j; j >>= 1)
      ;
  }
  for (int ii = 1, i = 2; i <= len; i <<= 1, ii <<= 1)
    for (int wn = Power(3, (MOD - 1) / i), j = 0; j < len; j += i)
      for (int w = 1, k = 0; k < ii; k++, w = 1ll * w * wn % MOD) {
        int y = 1ll * a[j + ii + k] * w % MOD;
        a[j + ii + k] = (a[j + k] - y + MOD) % MOD;
        a[j + k] = (a[j + k] + y) % MOD;
      }
  if (parameter == -1) {
    for (int i = 1; i < len - i; i++) swap(a[i], a[len - i]);
    int inv = Power(len, MOD - 2);
    for (int i = 0; i < len; i++) a[i] = 1ll * a[i] * inv % MOD;
  }
}
void Inv(int a[], int b[], int len) {
  static int tmp[LEN];
  if (len == 1) {
    memset(tmp, 0, sizeof tmp);
    b[0] = Power(a[0], MOD - 2);
    return;
  }
  Inv(a, b, len >> 1);
  memcpy(tmp, a, sizeof(int) * len);
  NTT(tmp, len << 1, 1);
  NTT(b, len << 1, 1);
  for (int i = 0; i < len << 1; i++)
    b[i] = 1ll * b[i] * (MOD + 2 - 1ll * tmp[i] * b[i] % MOD) % MOD;
  NTT(b, len << 1, -1);
  memset(b + len, 0, sizeof(int) * len);
}
void Sqrt(int a[], int b[], int len) {
  static int tmp[LEN], invb[LEN];
  if (len == 1) {
    memset(tmp, 0, sizeof tmp);
    b[0] = 1;
    return;
  }
  Sqrt(a, b, len >> 1);
  memset(invb, 0, sizeof(int) * len);
  Inv(b, invb, len);
  memcpy(tmp, a, sizeof(int) * len);
  NTT(tmp, len << 1, 1);
  NTT(b, len << 1, 1);
  NTT(invb, len << 1, 1);
  for (int i = 0; i < len << 1; i++)
    b[i] =
        499122177ll * (1ll * b[i] * b[i] % MOD + tmp[i]) % MOD * invb[i] % MOD;
  NTT(b, len << 1, -1);
  memset(b + len, 0, sizeof(int) * len);
}
int n, m;
int A[LEN], B[LEN];
int main() {
  scanf("%d%d", &n, &m);
  for (int c, i = 1; i <= n; i++) {
    scanf("%d", &c);
    A[c] = MOD - 4;
  }
  int len = m + 1;
  while (len & (len - 1)) len += len & -len;
  A[0] = 1;
  Sqrt(A, B, len);
  B[0]++;
  memset(A, 0, sizeof A);
  Inv(B, A, len);
  for (int i = 1; i <= m; i++) printf("%d\n", A[i] * 2 % MOD);
  return 0;
}