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;
char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
long long read() {
  char ch = getchar();
  long long x = 0;
  int op = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') op = -1;
  for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  return x * op;
}
int n, m, invn, a[1000005], b[1000005], c[1000005], w[1000005], r[1000005];
int ksm(int x, int p) {
  int ret = 1;
  for (x %= 998244353; p; p >>= 1, x = (long long)x * x % 998244353)
    if (p & 1) ret = (long long)ret * x % 998244353;
  return ret;
}
int getinv(int x) { return ksm(x, 998244353 - 2); }
void init(int &n) {
  int len = 0;
  for (; 1 << len < n; len++)
    ;
  n = 1 << len;
  int G = ksm(3, (998244353 - 1) / n);
  invn = getinv(n);
  w[0] = w[n] = 1;
  r[0] = 0;
  for (int i = (1); i <= (n - 1); i++) {
    w[i] = (long long)w[i - 1] * G % 998244353;
    r[i] = (r[i >> 1] >> 1) | ((i & 1) * (n >> 1));
  }
}
void fft(int a[], int all, int fl) {
  for (int i = (0); i <= (all - 1); i++)
    if (r[i] < i) swap(a[i], a[r[i]]);
  int n = 2, m = 1, x = all / 2;
  for (; n <= all; m = n, n <<= 1, x >>= 1)
    for (int i = 0; i < all; i += n)
      for (int k = 0; k < m; k++) {
        int t = (long long)(fl ? w[all - x * k] : w[x * k]) * a[i + m + k] %
                998244353;
        a[i + m + k] = (a[i + k] + 998244353 - t) % 998244353;
        a[i + k] = (a[i + k] + t) % 998244353;
      }
  if (fl)
    for (int i = (0); i <= (all - 1); i++)
      a[i] = (long long)a[i] * invn % 998244353;
}
void polyinv(int a[], int b[], int n) {
  if (n == 1) {
    b[0] = getinv(a[0]);
    return;
  }
  polyinv(a, b, n / 2);
  int n_ = 2 * n;
  init(n_);
  for (int i = (0); i <= (n - 1); i++) c[i] = a[i];
  for (int i = (n); i <= (n_ - 1); i++) c[i] = b[i] = 0;
  fft(b, n_, 0);
  fft(c, n_, 0);
  for (int i = (0); i <= (n_ - 1); i++)
    b[i] = (long long)b[i] *
           (2 + 998244353 - (long long)c[i] * b[i] % 998244353) % 998244353;
  fft(b, n_, 1);
  for (int i = (n); i <= (n_ - 1); i++) b[i] = 0;
}
int a_[1000005], b_[1000005];
void polysqrt(int a[], int b[], int n) {
  if (n == 1) {
    b[0] = 1;
    return;
  }
  polysqrt(a, b, n / 2);
  polyinv(b, b_, n);
  int n_ = n * 2;
  init(n_);
  for (int i = (0); i <= (n - 1); i++) a_[i] = a[i];
  for (int i = (n); i <= (n_ - 1); i++) a_[i] = b_[i] = b[i] = 0;
  fft(a_, n_, 0);
  fft(b_, n_, 0);
  for (int i = (0); i <= (n_ - 1); i++)
    b_[i] =
        (long long)(998244353 + 1) / 2 * a_[i] % 998244353 * b_[i] % 998244353;
  fft(b_, n_, 1);
  for (int i = (0); i <= (n - 1); i++)
    b[i] =
        ((long long)(998244353 + 1) / 2 * b[i] % 998244353 + b_[i]) % 998244353;
}
int main() {
  n = read(), m = read();
  a[0] = 1;
  for (int i = (1); i <= (n); i++) {
    int x = read();
    if (x <= m) a[x] = 998244353 - 4;
  }
  int n_ = m + 1;
  init(n_);
  polysqrt(a, b, n_);
  b[0]++;
  memset(a, 0, sizeof(a));
  polyinv(b, a, n_);
  for (int i = (1); i <= (m); i++) printf("%d\n", 2ll * a[i] % 998244353);
  return 0;
}