438_E. The Child and Binary Tree

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>

Example input:
2 3
1 2

3 10
9 4 3

5 10
13 10 6 4 15


Example output:
1
3
9

0
0
1
1
0
2
4
2
6
15

0
0
0
1
0
1
0
2
0
5


Tags: combinatorics
divide and conquer
fft
number theory
Difficulty rating: 3100

Solution:
#include <bits/stdc++.h>
const int mo = 998244353, G = 3, N = 150000;
int f[N], g[N], a[N << 1], b[N << 1], c[N << 1], rev[N << 1];
int qsm(int x, int y) {
  int i = 1;
  for (; y; y >>= 1, x = 1ll * x * x % mo)
    if (y & 1) i = 1ll * i * x % mo;
  return i;
}
void FFT(int *a, int n, int op) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) std::swap(a[i], a[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    int wn = qsm(G, (mo - 1) / i >> 1);
    if (op) wn = qsm(wn, mo - 2);
    for (int j = 0; j < n; j += i << 1) {
      int w = 1;
      for (int k = j; k < j + i; k++, w = 1ll * w * wn % mo) {
        int x = a[k], y = 1ll * w * a[k + i] % mo;
        a[k] = (x + y) % mo;
        a[k + i] = (x - y) % mo;
      }
    }
  }
  if (op) {
    int invn = qsm(n, mo - 2);
    for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * invn % mo;
  }
}
void solve(int l, int r) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  solve(l, mid);
  int n = 1, len = 0, m = (r - l) * 2 + mid - l;
  for (; n <= m; len++) n <<= 1;
  for (int i = 0; i < n; i++) a[i] = b[i] = c[i] = 0;
  for (int i = 1; i < n; i++)
    rev[i] = rev[i >> 1] >> 1 ^ ((i & 1) << (len - 1));
  for (int i = l; i <= mid; i++) a[i - l] = f[i];
  for (int i = 0; i <= r - l; i++) b[i] = f[i], c[i] = g[i];
  for (int i = 0; i < l && i <= r - l; i++) b[i] = (b[i] << 1) % mo;
  FFT(a, n, 0);
  FFT(b, n, 0);
  FFT(c, n, 0);
  for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * b[i] % mo * c[i] % mo;
  FFT(a, n, 1);
  for (int i = mid + 1; i <= r; i++) f[i] = (f[i] + a[i - l]) % mo;
  solve(mid + 1, r);
}
int main() {
  int n, m;
  scanf("%d%d\n", &n, &m);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    g[x] = 1;
  }
  f[0] = 1;
  solve(0, m);
  for (int i = 1; i <= m; i++) printf("%d\n", (f[i] + mo) % mo);
}