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 = 300005, mod = 998244353, g1 = 3, g2 = 332748118;
int n, m, A[N], B[N], C[N];
long long Pow(long long x, long long k) {
  long long t = 1;
  for (; k; k >>= 1, x = x * x % mod)
    if (k & 1) t = t * x % mod;
  return t;
}
int mul(int x) { return x >= mod ? x - mod : x; }
class NTT {
 public:
  int len, clc, invn, rev[N];
  void process(int L) {
    for (len = 1, clc = 0; len < L; len <<= 1, clc++)
      ;
    invn = Pow(len, mod - 2);
    for (int i = 0; i <= len; i++)
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << clc - 1);
  }
  void transform(int *s, int op) {
    for (int i = 1; i < len; i++)
      if (i < rev[i]) std::swap(s[i], s[rev[i]]);
    for (int i = 1; i < len; i <<= 1) {
      int wn = Pow(op > 0 ? g1 : g2, (mod - 1) / (i << 1));
      for (int j = 0; j < len; j += i << 1)
        for (int k = 0, w = 1; k < i; k++, w = 1ll * w * wn % mod) {
          int A = s[j + k], B = 1ll * s[i + j + k] * w % mod;
          s[j + k] = mul(A + B), s[i + j + k] = mul(A - B + mod);
        }
    }
    if (op < 0)
      for (int i = 0; i < len; i++) s[i] = 1ll * s[i] * invn % mod;
  }
} F;
void getinv(int *a, int *b, int len) {
  if (len == 1) return (void)(b[0] = Pow(a[0], mod - 2));
  getinv(a, b, len + 1 >> 1);
  static int tp[N];
  F.process(len << 1);
  for (int i = 0; i < F.len; i++) tp[i] = i < len ? a[i] : 0;
  F.transform(tp, 1), F.transform(b, 1);
  for (int i = 0; i < F.len; i++)
    tp[i] = 1ll * b[i] * mul(2 - 1ll * tp[i] * b[i] % mod + mod) % mod;
  F.transform(tp, -1);
  for (int i = 0; i < F.len; i++) b[i] = i < len ? tp[i] : 0;
}
void getsqr(int *a, int *b, int len) {
  if (len == 1) return (void)(b[0] = sqrt(a[0]));
  getsqr(a, b, len + 1 >> 1);
  static int tp[N], tx[N];
  for (int i = 0; i < len; i++) tx[i] = a[i], tp[i] = 0;
  getinv(b, tp, len);
  F.process(len << 1);
  F.transform(tp, 1);
  F.transform(tx, 1);
  for (int i = 0; i < F.len; i++) tp[i] = 1ll * tp[i] * tx[i] % mod;
  F.transform(tp, -1);
  for (int i = 0; i < len; i++)
    b[i] = 1ll * mul(b[i] + tp[i]) * (mod + 1 >> 1) % mod;
  for (int i = 0; i < F.len; i++) tp[i] = 0;
}
int main() {
  scanf("%d%d", &m, &n);
  n++, A[0] = 1;
  for (int i = 1, x; i <= m; i++) scanf("%d", &x), A[x] = mul(A[x] + mod - 4);
  getsqr(A, B, n);
  B[0] = mul(B[0] + 1);
  getinv(B, C, n);
  for (int i = 1; i < n; i++) printf("%d\n", 2ll * C[i] % mod);
}