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 int mod = 998244353;
inline int Pow(int x, int y) {
  int res = 1;
  for (; y; y >>= 1, x = (long long)x * x % mod)
    if (y & 1) res = (long long)res * x % mod;
  return res;
}
const int N = 600010, inv2 = (mod + 1) / 2;
int r[N];
inline void NTT(int a[], int len, int type) {
  for (int i = 0; i < len; i++)
    if (i < r[i]) swap(a[i], a[r[i]]);
  for (int mid = 2; mid <= len; mid <<= 1) {
    int Wn = Pow(3, type ? (mod - 1) / mid : mod - 1 - (mod - 1) / mid);
    for (int i = 0; i < len; i += mid)
      for (int j = i, w = 1, t; j < i + (mid >> 1);
           j++, w = (long long)w * Wn % mod)
        t = (long long)a[j + (mid >> 1)] * w % mod,
        a[j + (mid >> 1)] = (a[j] - t + mod) % mod, a[j] = (a[j] + t) % mod;
  }
  if (!type)
    for (int i = 0, inv = Pow(len, mod - 2); i < len; i++)
      a[i] = (long long)a[i] * inv % mod;
}
inline void Get(int len, int l) {
  for (int i = 0; i < len; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << l - 1);
}
inline void Inv(const int A[], int B[], int n) {
  if (n == 1) return void(B[0] = Pow(A[0], mod - 2));
  Inv(A, B, (n + 1) >> 1);
  static int tmpa[N];
  int len = 1, l = 0;
  while (len <= n * 3) len <<= 1, l++;
  for (int i = 0; i < n; i++) tmpa[i] = A[i];
  fill(tmpa + n, tmpa + len, 0);
  Get(len, l), NTT(tmpa, len, 1), NTT(B, len, 1);
  for (int i = 0; i < len; i++)
    B[i] = (2 - (long long)tmpa[i] * B[i] % mod + mod) * B[i] % mod;
  NTT(B, len, 0), fill(B + n, B + len, 0);
}
inline void Sqrt(const int A[], int B[], int n) {
  if (n == 1) return void(B[0] = 1);
  Sqrt(A, B, (n + 1) >> 1);
  static int tmpa[N], invb[N];
  int len = 1, l = 0;
  for (int i = 0; i < n; i++) tmpa[i] = A[i];
  while (len <= n * 2) len <<= 1, l++;
  memset(invb, 0, sizeof(invb));
  Inv(B, invb, n), Get(len, l), fill(tmpa + n, tmpa + len, 0);
  NTT(tmpa, len, 1), NTT(invb, len, 1);
  for (int i = 0; i < len; i++) tmpa[i] = (long long)tmpa[i] * invb[i] % mod;
  NTT(tmpa, len, 0);
  for (int i = 0; i < n; i++) B[i] = (long long)(B[i] + tmpa[i]) * inv2 % mod;
}
int A[N], B[N], F[N];
int main() {
  int n, m, len = 1;
  scanf("%d%d", &n, &m), m++;
  for (int i = 1, a; i <= n; i++)
    scanf("%d", &a), A[a] = mod - 4, len = max(len, a + 1);
  A[0] = 1, Sqrt(A, B, m), B[0]++, Inv(B, F, m);
  for (int i = 1; i < m; i++) printf("%d\n", 2 * F[i] % mod);
}