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 LG = 18, N = 1 << LG, Mod = 998244353, Rn = 3;
int rev[N + 5];
inline int Power(int a, int b) {
  int ret = 1;
  for (; b; b >>= 1, a = 1ll * a * a % Mod)
    if (b & 1) ret = 1ll * ret * a % Mod;
  return (ret);
}
inline void NTT(int* F, int n, bool inv) {
  int d = LG - __builtin_ctz(n);
  for (int i = 0; i < n; i++)
    if (i < (rev[i] >> d)) swap(F[i], F[(rev[i] >> d)]);
  for (int len = 1; len < n; len <<= 1) {
    int wn = Power(Rn, (Mod - 1) / (len << 1));
    if (inv) wn = Power(wn, Mod - 2);
    for (int i = 0; i < n; i += (len << 1))
      for (int j = i, w = 1; j < i + len; j++) {
        int a = 1ll * F[j + len] * w % Mod;
        F[j + len] = F[j] - a;
        F[j] += a;
        if (F[j + len] < 0) F[j + len] += Mod;
        if (F[j] >= Mod) F[j] -= Mod;
        w = 1ll * w * wn % Mod;
      }
  }
  if (inv)
    for (int i = 0, rn = Power(n, Mod - 2); i < n; i++)
      F[i] = 1ll * F[i] * rn % Mod;
}
inline void Inverse(int* A, int* B, int* C, int n) {
  for (int i = 0; i < n + n; i++) B[i] = C[i] = 0;
  B[0] = Power(A[0], Mod - 2);
  for (int j = 2; j <= n; j <<= 1) {
    for (int i = 0; i < j; i++) C[i] = A[i];
    NTT(C, j << 1, 0);
    NTT(B, j << 1, 0);
    for (int i = 0; i < j + j; i++)
      B[i] = (2 - 1ll * C[i] * B[i] % Mod + Mod) * B[i] % Mod;
    NTT(B, j << 1, 1);
    for (int i = j; i < j + j; i++) B[i] = 0;
  }
}
void Sqrt(int* A, int* B, int* C, int* D, int n) {
  B[0] = 1;
  for (int j = 2; j <= n; j <<= 1) {
    Inverse(B, D, C, j);
    for (int i = 0; i < j; i++) C[i] = A[i], C[i + j] = 0;
    NTT(C, j << 1, 0);
    NTT(D, j << 1, 0);
    for (int i = 0; i < j + j; i++) C[i] = 1ll * C[i] * D[i] % Mod, D[i] = 0;
    NTT(C, j << 1, 1);
    for (int i = 0; i < j; i++)
      B[i] = 1ll * (B[i] + C[i]) * (Mod + 1) / 2 % Mod;
  }
}
int n, m, A[N + 4], B[N + 4], C[N + 4], D[N + 4];
int main() {
  for (int i = 0; i < N; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (LG - 1));
  scanf("%d%d", &n, &m);
  for (int i = 1, a; i <= n; i++) {
    scanf("%d", &a);
    if (a <= m) A[a] = Mod - 4;
  }
  n = 1;
  while (n <= m) n <<= 1;
  A[0]++;
  Sqrt(A, B, C, D, n);
  B[0]++;
  Inverse(B, A, C, n);
  for (int i = 1; i <= m; i++) printf("%d\n", A[i] * 2 % Mod);
  return (0);
}