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 G = 3;
const int maxn = 100000;
const int mod = 998244353;
const long double Pi = acos(-1.0);
const double eps = 1e-7;
template <class T>
void read(T &x) {
  x = 0;
  int f = 0;
  char ch = getchar();
  while (!isdigit(ch)) {
    f |= (ch == '-');
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  x = f ? -x : x;
  return;
}
int n, m, invG, inv2, a[maxn * 3 + 5], b[maxn * 3 + 5], c[maxn * 3 + 5];
int rev[maxn * 3 + 5], h[maxn * 3 + 5], p[maxn * 3 + 5];
inline int inc(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
inline int dec(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
inline int power(int a, int b, int p) {
  int ans = 1;
  for (; b; b >>= 1) {
    if (b & 1) ans = 1ll * ans * a % p;
    a = 1ll * a * a % p;
  }
  return ans;
}
inline int inv(int x) { return power(x, mod - 2, mod); }
inline int ready(int len) {
  int maxx = 1, num = 0;
  while (maxx < len) {
    maxx <<= 1;
    num++;
  }
  for (int i = 0; i < maxx; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (num - 1));
  return maxx;
}
inline void NTT(int *a, int maxx, int type) {
  for (int i = 0; i < maxx; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int mid = 1; mid < maxx; mid <<= 1) {
    int w1 = power(~type ? G : invG, (mod - 1) / (mid << 1), mod);
    for (int r = mid << 1, j = 0; j < maxx; j += r) {
      int w = 1;
      for (int k = 0; k < mid; k++, w = 1ll * w * w1 % mod) {
        int x = a[j | k];
        int y = 1ll * w * a[j | k | mid] % mod;
        a[j | k] = inc(x, y);
        a[j | k | mid] = dec(x, y);
      }
    }
  }
  if (!(~type)) {
    int invm = inv(maxx);
    for (int i = 0; i < maxx; i++) a[i] = 1ll * a[i] * invm % mod;
  }
}
void polyinv(int *f, int *g, int n) {
  if (n == 1) {
    g[0] = inv(f[0]);
    return;
  }
  polyinv(f, g, (n + 1) >> 1);
  int maxx = ready(n << 1);
  for (int i = 0; i < n; i++) h[i] = f[i];
  for (int i = n; i < maxx; i++) h[i] = 0;
  NTT(h, maxx, 1);
  NTT(g, maxx, 1);
  for (int i = 0; i < maxx; i++) h[i] = 1ll * h[i] * g[i] % mod;
  for (int i = 0; i < maxx; i++) g[i] = 1ll * g[i] * dec(2ll, h[i]) % mod;
  NTT(g, maxx, -1);
  for (int i = n; i < maxx; i++) g[i] = 0;
}
void polysqrt(int *f, int *g, int n) {
  if (n == 1) {
    g[0] = 1;
    return;
  }
  polysqrt(f, g, (n + 1) >> 1);
  int maxx = ready(n << 1);
  for (int i = 0; i < maxx; i++) p[i] = 0;
  polyinv(g, p, n);
  for (int i = 0; i < n; i++) h[i] = f[i];
  for (int i = n; i < maxx; i++) p[i] = h[i] = 0;
  NTT(g, maxx, 1);
  NTT(p, maxx, 1);
  NTT(h, maxx, 1);
  for (int i = 0; i < maxx; i++) p[i] = 1ll * p[i] * h[i] % mod;
  for (int i = 0; i < maxx; i++) g[i] = 1ll * inv2 * inc(g[i], p[i]) % mod;
  NTT(g, maxx, -1);
  for (int i = n; i < maxx; i++) g[i] = 0;
}
int main() {
  srand(time(0));
  invG = inv(G);
  inv2 = inv(2);
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    a[x] = 1;
  }
  m++;
  for (int i = 0; i < m; i++) a[i] = 1ll * a[i] * (mod - 4ll) % mod;
  a[0]++;
  polysqrt(a, b, m);
  b[0]++;
  polyinv(b, c, m);
  for (int i = 0; i < m; i++) c[i] = 2ll * c[i] % mod;
  for (int i = 1; i < m; i++) printf("%d\n", c[i]);
  return 0;
}