集合划分
题号:NC233101
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定一个 n 个数的序列 常数 K

定义一个仅含 的元素的集合的 S 价值为:

令其中的元素依次为 ,则 S 的价值为 ,其中一些数的 Mex 为其中最小的没有出现过的数。

对于每个 ,求出有多少种将 分为两个集合 S_1,S_2 的方式,使得两个集合的价值和为 k,两种方式不同当且仅当 S_1 不同或 S_2 不同。

输入描述:

由于 n 可能很大,我们采取如下方式读入。

第一行两个数  和常数 ,其中 m 表示 a_i 的值域。

接下来一行 个数,其中第 i 个数   表示 i-1 的在序列出现次数,可以发现在序列中出现的具体位置并不影响答案。

保证

输出描述:

一行  个整数,第 i 个数表示  时的答案,对 998244353 取模。
示例1

输入

复制
0 2
2

输出

复制
0 2 2
示例2

输入

复制
7 20
3 2 2 2 1 5 0 2

输出

复制
0 8192 6144 16896 16128 20184 16344 19824 9120 6336 11904 0 0 0 0 0 0 0 0 0 0