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 long long maxn = 400010, mod = 998244353;
long long n, m, a[maxn], bin[1000010], a1[maxn], a2[maxn], a3[maxn], a4[maxn],
    c[maxn], d[maxn], rev[maxn], inv2;
long long qpow(long long a, long long b) {
  long long res = 1;
  while (b) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return res;
}
void NTT(long long *t, long long n, long long flag) {
  long long len = bin[n];
  for (long long i = 0; i < n; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  for (long long i = 0; i < n; i++)
    if (i < rev[i]) swap(t[i], t[rev[i]]);
  for (long long i = 1; i < n; i <<= 1) {
    long long Wn = qpow(3, (mod - 1) / (i << 1));
    if (flag == -1) Wn = qpow(Wn, mod - 2);
    for (long long j = 0; j < n; j += (i << 1)) {
      long long w = 1;
      for (long long k = 0; k < i; k++, w = (w * Wn) % mod) {
        long long x = t[j + k], y = (w * t[j + k + i]) % mod;
        t[j + k] = (x + y) % mod;
        t[j + k + i] = (x - y + mod) % mod;
      }
    }
  }
  if (flag == -1) {
    long long temp = qpow(n, mod - 2);
    for (long long i = 0; i < n; i++) t[i] = t[i] * temp % mod;
  }
}
void cinv(long long *a, long long *b, long long n) {
  if (n == 1) {
    b[0] = qpow(a[0], mod - 2);
    return;
  }
  cinv(a, b, (n + 1) >> 1);
  long long m = 1;
  while (m <= n) m <<= 1;
  for (long long i = 0; i < n; i++) c[i] = a[i];
  for (long long i = n; i < m; i++) c[i] = 0;
  NTT(c, m, 1), NTT(b, m, 1);
  for (long long i = 0; i < m; i++)
    b[i] = (2 * b[i] % mod - c[i] * b[i] % mod * b[i] % mod + mod) % mod;
  NTT(b, m, -1);
  for (long long i = n; i < m; i++) b[i] = 0;
}
void csqrt(long long *a, long long *b, long long n) {
  static long long c[maxn], d[maxn];
  if (n == 1) {
    b[0] = sqrt(a[0]);
    return;
  }
  csqrt(a, b, (n + 1) >> 1);
  memset(d, 0, sizeof(d));
  cinv(b, d, n);
  for (long long i = 0; i < n; i++) c[i] = a[i];
  for (long long i = n; i < m; i++) c[i] = 0;
  long long m = 1;
  while (m <= n) m <<= 1;
  NTT(c, m, 1);
  NTT(d, m, 1);
  NTT(b, m, 1);
  for (long long i = 0; i < m; i++)
    b[i] = inv2 * ((b[i] + c[i] * d[i] % mod) % mod) % mod;
  NTT(b, m, -1);
  for (long long i = n; i < m; i++) b[i] = 0;
}
int main() {
  inv2 = qpow(2, mod - 2);
  for (long long i = 0; i <= 19; i++) bin[1 << i] = i;
  scanf("%lld%lld", &m, &n);
  a[0] = 1;
  for (long long i = 1; i <= m; i++) {
    long long x;
    scanf("%lld", &x);
    if (x <= n) a[x] -= 4;
    if (a[x] < 0) a[x] += mod;
  }
  int len = 1;
  while (len <= n) len <<= 1;
  csqrt(a, a1, len);
  (++a1[0]) %= mod;
  cinv(a1, a2, len);
  for (int i = 1; i <= n; i++) printf("%lld\n", a2[i] * 2 % mod);
  return 0;
}