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 long long Getint() {
  char ch = getchar();
  long long fh = 1, x = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') fh = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') (x *= 10) += ch ^ 48, ch = getchar();
  return fh * x;
}
const int Mod = 998244353;
const long long inv2 = Mod + 1 >> 1;
int lst, n, m, rev[800005];
long long A[800005], B[800005], C[800005], wi[800005];
inline long long Fastpow(long long x, long long y) {
  long long tmp = 1;
  while (y) {
    if (y & 1) tmp = tmp * x % Mod;
    x = x * x % Mod;
    y >>= 1;
  }
  return tmp;
}
inline int Make(int len) { return 1 << int(ceil(log2(len))); }
inline int Trans(int len) {
  int l = ceil(log2(len));
  len = 1 << l;
  for (int i = 1; i < len; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);
  return lst = len;
}
inline void NTT(long long F[], int len, int f) {
  if (lst != len) Trans(len);
  for (int i = 1; i < len; i++)
    if (rev[i] < i) swap(F[rev[i]], F[i]);
  for (int i = 1; i < len; i <<= 1) {
    long long wn = Fastpow(3, f * (Mod - 1) / (i << 1) + Mod - 1);
    wi[0] = 1;
    for (int j = 1; j < i; j++) wi[j] = wi[j - 1] * wn % Mod;
    for (int j = 0; j < len; j += i << 1) {
      for (int k = 0; k < i; k++) {
        long long x = F[j + k], y = F[i + j + k] * wi[k] % Mod;
        F[j + k] = (x + y) % Mod;
        F[i + j + k] = (x - y + Mod) % Mod;
      }
    }
  }
  if (f == 1) return;
  long long wn = Fastpow(len, Mod - 2);
  for (int i = 0; i < len; i++) F[i] = F[i] * wn % Mod;
}
long long Pinv[800005];
inline void Inverse(long long F[], long long G[], int len) {
  if (len == 1) {
    F[0] = Fastpow(G[0], Mod - 2);
    return;
  }
  Inverse(F, G, len >> 1);
  int l = len << 1;
  for (int i = 0; i < len; i++) Pinv[i] = G[i];
  for (int i = len; i < l; i++) Pinv[i] = 0;
  for (int i = len >> 1; i < l; i++) F[i] = 0;
  NTT(Pinv, l, 1);
  NTT(F, l, 1);
  for (int i = 0; i < l; i++)
    F[i] = F[i] * (2 - Pinv[i] * F[i] % Mod + Mod) % Mod;
  NTT(F, l, -1);
  for (int i = len; i < l; i++) F[i] = 0;
}
long long Psq1[800005], Psq2[800005];
inline void Sqrt(long long F[], long long G[], int len) {
  if (len == 1) {
    F[0] = sqrt(G[0]);
    return;
  }
  Sqrt(F, G, len >> 1);
  int l = len << 1;
  for (int i = len >> 1; i < len; i++) F[i] = 0;
  Inverse(Psq1, F, len);
  for (int i = 0; i < len; i++) Psq2[i] = G[i];
  for (int i = len; i < l; i++) Psq1[i] = Psq2[i] = F[i] = 0;
  NTT(Psq1, l, 1);
  NTT(Psq2, l, 1);
  NTT(F, l, 1);
  for (int i = 0; i < l; i++)
    F[i] = (F[i] * F[i] % Mod + Psq2[i]) % Mod * inv2 % Mod * Psq1[i] % Mod;
  NTT(F, l, -1);
  for (int i = len; i < l; i++) F[i] = 0;
}
int main() {
  int x, y, z;
  m = Getint();
  n = Getint();
  for (int i = 1; i <= m; i++)
    if ((x = Getint()) <= n) C[x] = 1;
  for (int i = 0; i <= n; i++) A[i] = (Mod - 4 * C[i] % Mod) % Mod;
  int len = Make(n + 1 << 1);
  (++A[0]) %= Mod;
  for (int i = n; i >= 0; i--)
    if (C[i]) x = i;
  for (int i = 0; i <= n; i++) C[i] = C[i + x];
  Sqrt(B, A, len);
  Inverse(A, C, len);
  for (int i = 0; i < len; i++) B[i] = (Mod - B[i]) % Mod;
  (++B[0]) %= Mod;
  int l = len << 1;
  for (int i = len; i < l; i++) A[i] = B[i] = 0;
  NTT(B, l, 1);
  NTT(A, l, 1);
  for (int i = 0; i < l; i++) A[i] = A[i] * B[i] % Mod;
  NTT(A, l, -1);
  for (int i = x; i < l; i++) A[i - x] = A[i];
  for (int i = 1; i <= n; i++) cout << inv2 * A[i] % Mod << '\n';
  return 0;
}