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>
const int N = 262144 + 5;
const int mod = 998244353;
using namespace std;
int n, m;
long long c[N], Inv2, root_c[N], inv_root_c[N];
int rev[N];
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
long long pow(long long a, int b, int mod) {
  long long res = 1;
  for (; b; b >>= 1, a = (long long)a * a % mod)
    if (b & 1) res = res * a % mod;
  return res;
}
void NTT(long long *a, int n, int f) {
  int h, i;
  register int j;
  for (i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (h = 2; h <= n; h <<= 1) {
    long long wn = pow(3, (mod - 1) / h, mod);
    for (i = 0; i < n; i += h) {
      long long w = 1;
      for (j = 0; j < (h >> 1); j++, w = (long long)w * wn % mod) {
        long long t = (long long)a[i + j + (h >> 1)] * w % mod;
        a[i + j + (h >> 1)] = ((a[i + j] - t) % mod + mod) % mod;
        a[i + j] = (a[i + j] + t) % mod;
      }
    }
  }
  if (f == -1) {
    for (i = 1; i < (n >> 1); i++) swap(a[i], a[n - i]);
    long long inv = pow(n, mod - 2, mod);
    for (i = 0; i < n; i++) a[i] = (long long)a[i] * inv % mod;
  }
}
void Get_Inv(long long *a, long long *b, int n) {
  static long long tmp[N];
  if (n == 1) {
    b[0] = pow(a[0], mod - 2, mod);
    return;
  }
  Get_Inv(a, b, n >> 1);
  memcpy(tmp, a, sizeof(a[0]) * n);
  memset(tmp + n, 0, sizeof(a[0]) * n);
  int m = n, L = 0, nn = n;
  for (n = 1; n <= m; n <<= 1) L++;
  int i;
  for (i = 0; i < n; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (L - 1));
  NTT(tmp, n, 1), NTT(b, n, 1);
  for (i = 0; i < n; i++)
    tmp[i] = (long long)b[i] *
             (((2LL - (long long)tmp[i] * b[i] % mod) % mod + mod) % mod) % mod;
  NTT(tmp, n, -1);
  for (i = 0; i < (n >> 1); i++) b[i] = tmp[i];
  memset(b + nn, 0, sizeof(b[0]) * nn);
  n = nn;
}
void Get_Root(long long *a, long long *b, int n) {
  static long long tmp[N], inv_b[N];
  if (n == 1) {
    b[0] = 1;
    return;
  }
  int i;
  Get_Root(a, b, n >> 1);
  memset(inv_b, 0, sizeof(a[0]) * n);
  Get_Inv(b, inv_b, n);
  memcpy(tmp, a, sizeof(a[0]) * n);
  memset(tmp + n, 0, sizeof(a[0]) * n);
  int m = n, L = 0, nn = n;
  for (n = 1; n <= m; n <<= 1) L++;
  for (i = 0; i < n; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (L - 1));
  NTT(tmp, n, 1), NTT(b, n, 1), NTT(inv_b, n, 1);
  for (i = 0; i < n; i++)
    tmp[i] = (long long)Inv2 *
             ((b[i] + (long long)inv_b[i] * tmp[i] % mod) % mod) % mod;
  NTT(tmp, n, -1);
  for (i = 0; i < (n >> 1); i++) b[i] = tmp[i];
  memset(b + nn, 0, sizeof(b[0]) * nn);
  n = nn;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) c[read()]++;
  Inv2 = pow(2, mod - 2, mod);
  c[0] = ((1 - c[0]) % mod + mod) % mod;
  for (int i = 1; i <= 100000; i++) c[i] = ((-4 * c[i]) % mod + mod) % mod;
  int l;
  for (l = 1; l <= m; l <<= 1)
    ;
  Get_Root(c, root_c, l);
  root_c[0] = (1 + root_c[0]) % mod;
  Get_Inv(root_c, inv_root_c, l);
  for (int i = 0; i <= 100000; i++)
    inv_root_c[i] = ((long long)2 * inv_root_c[i]) % mod;
  for (int i = 1; i <= m; i++) printf("%d\n", inv_root_c[i]);
}