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;
inline int read() {
  int sum = 0, p = 1;
  char ch = getchar();
  while (!(('0' <= ch && ch <= '9') || ch == '-')) ch = getchar();
  if (ch == '-') p = -1, ch = getchar();
  while ('0' <= ch && ch <= '9') sum = sum * 10 + ch - 48, ch = getchar();
  return sum * p;
}
const int maxn = 4e5 + 20;
const int mod = 998244353;
const int inv2 = (mod + 1) / 2;
int n, c[maxn], m, rev[maxn];
inline int power(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1) ans = (long long)ans * a % mod;
    b >>= 1;
    a = (long long)a * a % mod;
  }
  return ans;
}
inline void NTT(int *p, int N, int op) {
  int n = 1, l = 0;
  while (n < N) n <<= 1, l++;
  for (int i = (1), _end_ = (n - 1); i <= _end_; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (l - 1));
  for (int i = (0), _end_ = (n - 1); i <= _end_; i++)
    if (i < rev[i]) swap(p[i], p[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    int W = power(3, (mod - 1) / (i << 1));
    for (int j = 0; j < n; j += i << 1) {
      int w = 1;
      for (int k = j; k < i + j; k++, w = (long long)w * W % mod) {
        int x = p[k], y = (long long)p[k + i] * w % mod;
        p[k] = x + y;
        p[k + i] = x - y;
        if (p[k] > mod) p[k] -= mod;
        if (p[k + i] < 0) p[k + i] += mod;
      }
    }
  }
  if (op == -1) {
    int inv = power(n, mod - 2);
    for (int i = (0), _end_ = (n - 1); i <= _end_; i++)
      p[i] = (long long)p[i] * inv % mod;
    reverse(p + 1, p + n);
  }
}
int A[maxn], B[maxn], C[maxn];
int tmp[maxn];
void Inv(int *p, int *q, int len) {
  if (len == 1) {
    q[0] = power(p[0], mod - 2);
    return;
  }
  Inv(p, q, len >> 1);
  for (int i = (0), _end_ = (len - 1); i <= _end_; i++)
    A[i] = p[i], B[i] = q[i];
  NTT(A, len << 1, 1);
  NTT(B, len << 1, 1);
  for (int i = (0), _end_ = ((len << 1) - 1); i <= _end_; i++)
    A[i] = (long long)B[i] * B[i] % mod * A[i] % mod;
  NTT(A, len << 1, -1);
  for (int i = (0), _end_ = (len - 1); i <= _end_; i++)
    q[i] = ((-A[i] + 2 * q[i]) % mod + mod) % mod;
  for (int i = (0), _end_ = (len << 1); i <= _end_; i++) A[i] = B[i] = 0;
}
void Sqrt(int *p, int *q, int len) {
  if (len == 1) {
    q[0] = p[0];
    return;
  }
  Sqrt(p, q, len >> 1);
  for (int i = (0), _end_ = (len); i <= _end_; i++) C[i] = p[i];
  Inv(q, tmp, len);
  NTT(tmp, len << 1, 1);
  NTT(C, len << 1, 1);
  for (int i = (0), _end_ = ((len << 1) - 1); i <= _end_; i++)
    tmp[i] = (long long)tmp[i] * C[i] % mod;
  NTT(tmp, len << 1, -1);
  for (int i = (0), _end_ = (len - 1); i <= _end_; i++)
    q[i] = (long long)(tmp[i] + q[i]) * inv2 % mod;
  for (int i = (0), _end_ = (len << 1); i <= _end_; i++) C[i] = tmp[i] = 0;
}
void init() {
  m = read();
  n = read();
  for (int i = (1), _end_ = (m); i <= _end_; i++) c[read()] = 1;
}
int d[maxn];
void doing() {
  int N = 1, l = 0;
  while (N <= n) N <<= 1, l++;
  for (int i = (0), _end_ = (N - 1); i <= _end_; i++)
    c[i] = (-4 * c[i] + mod) % mod;
  c[0]++;
  Sqrt(c, d, N);
  for (int i = (0), _end_ = (N - 1); i <= _end_; i++) c[i] = 0;
  d[0] = (d[0] + 1) % mod;
  Inv(d, c, N);
  for (int i = (0), _end_ = (N - 1); i <= _end_; i++) c[i] = c[i] * 2 % mod;
  for (int i = (1), _end_ = (n); i <= _end_; i++) printf("%d\n", c[i]);
}
int main() {
  init();
  doing();
  return 0;
}