???
题号:NC296461
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}Zeeman 有一个由 n 个整数组成的数组 \{a_1, a_2, \dots, a_n\} \left(-1 \leq a_i \lt k \right) 和一个由 n 个整数集合(注意,集合元素不可重)组成的数组 \{ \Bbb S_1, \Bbb S_2, \dots, \Bbb S_n \}
\hspace{15pt}对于任意的 1 \leq i \leq na_i 可以任意修改为集合 \Bbb S_i 中的任意一个值,花费 \left[a_i \neq -1\right]
\hspace{15pt}定义函数 f(b)g(b),其中 g(b) 表示将 \textstyle{\sum_{i=1}^{|b|}b_i} 转换为 k 进制数后的数位数组:
f(b) =<br />\begin{cases}<br />    b & |b| = 1\\<br />    f\big(g(b)\big) & |b| \gt 1<br />\end{cases}

\hspace{15pt}Zeeman 想知道,有多少种给 a 重新赋值的方案,使得将 f(a) 的结果表示为一个 k 进制数后恰好为 x,且总花费不超过 1。你需要对 0 \leq x \lt k 的每个 x 输出答案。由于答案可能很大,请将答案对 998\,244\,353 取模后输出。

【名词解释】
\hspace{15pt}本题公式中的方括号代表艾弗森括号,具体地,[P] = \begin{cases} 1 & \text{如果 } P \text{ 为真} \\ 0 & \text{如果 } P \text{ 为假} \end{cases}

输入描述:

\hspace{15pt}第一行输入两个整数 n, k \left(1 \leq n \leq 2 \times 10^3;\ 2 \leq k \leq 2 \times 10^3\right),表示数组长度、k 进制数。
\hspace{15pt}第二行输入 n 个整数 a_1, a_2, \dots, a_n \left(-1 \leq a_i \lt k\right),表示数组中的元素。
\hspace{15pt}此后 n 行,第 i 行依次输入:
\hspace{23pt}\bullet\,一个整数 c_i \left(0 \leq c_i \leq k\right),表示集合 \Bbb S_i 中的元素个数;
\hspace{23pt}\bullet\,c_i 个互不相同的整数 \Bbb S_{i1}, \Bbb S_{i2}, \dots, \Bbb S_{ic_i} \left(0 \leq \Bbb S_{ij} \lt k\right),表示集合 \Bbb S_i 中的元素。

\hspace{15pt}除此之外,保证对于所有的 a_i = -1,均有 0 \lt c_i;且全部集合中的元素个数之和 \textstyle{\sum c_i} 不超过 \min\left\{n \times k, 10^6\right\}

输出描述:

\hspace{15pt}在一行上输出 k 个非负整数,其中第 i 个非负整数表示 x = i 时的答案对 998\,244\,353 取模后的结果。
示例1

输入

复制
6 10
1 -1 4 5 -1 4
2 1 9
2 1 9
3 8 1 0
4 1 9 8 0
4 1 9 8 0
4 1 9 8 0

输出

复制
0 27 22 11 7 9 7 3 7 19