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 double Pi = acos(-1);
void Read(int &p) {
  p = 0;
  char c = getchar();
  for (; c < '0' || c > '9'; c = getchar())
    ;
  for (; c >= '0' && c <= '9'; c = getchar()) p = p * 10 + c - '0';
}
int ksm(int a, int k) {
  if (!k) return 1;
  int p = ksm(a, k / 2);
  if (k & 1) return (long long)p * p % 998244353 * a % 998244353;
  return (long long)p * p % 998244353;
}
namespace Part1 {
int G[400005], E[400005], T[400005];
}
namespace Part2 {
int G[400005], E[400005], T[400005];
}
int M = int(sqrt(998244353) + 0.5);
void DFT(int *A, int f, int w) {
  for (int i = 1, j = 0; i < w; i++) {
    for (int d = w >> 1; j ^= d, ~j & d; d >>= 1)
      ;
    if (i < j) swap(A[i], A[j]);
  }
  for (int i = 1; i < w; i <<= 1) {
    int wn = ksm(3, (998244353 - 1) / (i << 1)) % 998244353;
    if (f == -1) wn = ksm(wn, 998244353 - 2);
    for (int j = 0; j < w; j += (i << 1)) {
      int w1 = 1;
      for (int k = 0; k < i; k++) {
        int x = A[j + k], y = (long long)A[j + k + i] * w1 % 998244353;
        A[j + k] = (x + y) % 998244353;
        A[j + k + i] = (x - y) % 998244353;
        w1 = (long long)w1 * wn % 998244353;
      }
    }
  }
  if (f == -1) {
    int s = ksm(w, 998244353 - 2);
    for (int i = 0; i < w; i++) A[i] = (long long)A[i] * s % 998244353;
  }
}
void NTT(int *A, int *B, int *C, int w) {
  DFT(A, 1, w);
  DFT(B, 1, w);
  for (int i = 0; i < w; i++) C[i] = (long long)A[i] * B[i] % 998244353;
  DFT(C, -1, w);
}
void INV(int *A, int *B, int w) {
  using namespace Part1;
  if (w == 1) {
    B[0] = ksm(A[0], 998244353 - 2);
    return;
  }
  INV(A, B, w / 2);
  for (int i = 0; i < w; i++) T[i] = A[i];
  for (int i = w / 2; i < w; i++) B[i] = T[i] = 0;
  for (int i = 0; i < w; i++) {
    G[i] = 2 * B[i] % 998244353;
    E[i] = B[i];
  }
  NTT(E, B, E, w);
  for (int i = w / 2; i < w; i++) E[i] = 0;
  NTT(T, E, T, w);
  for (int i = 0; i < w; i++) B[i] = (G[i] - T[i]) % 998244353;
}
void SQR(int *A, int *B, int w) {
  using namespace Part2;
  if (w == 1) {
    B[0] = 1;
    return;
  }
  SQR(A, B, w / 2);
  for (int i = 0; i < w; i++) T[i] = A[i];
  for (int i = w / 2; i < w; i++) B[i] = T[i] = 0;
  for (int i = 0; i < w; i++) G[i] = B[i];
  INV(B, E, w);
  for (int i = w / 2; i < w; i++) E[i] = 0;
  NTT(T, E, T, w);
  for (int i = 0; i < w; i++) B[i] = (G[i] + T[i]) * 499122177ll % 998244353;
}
int n, m, val[400005], now[400005];
int main() {
  Read(n), Read(m);
  for (int i = 1; i <= n; i++) {
    int p;
    Read(p);
    val[p] = -4;
  }
  val[0] = 1;
  int w = 1;
  while (w <= 2 * m) w <<= 1;
  SQR(val, now, w);
  for (int i = w / 2; i < w; i++) now[i] = 0;
  now[0]++;
  INV(now, val, w);
  for (int i = 0; i < w; i++) val[i] = 2 * val[i] % 998244353;
  for (int i = 1; i <= m; i++) printf("%d\n", (val[i] + 998244353) % 998244353);
}