#P50012. 计数(count)

计数(count)

【题目描述】

【】是一名噗叽组选手。

【】学习了递归,他想生成一棵树,于是他写下了这样的代码:

int cnt=0;
int solve(int n){
    if(n==0){cnt++;return cnt-1;}
    int ls=solve(n-1);int rs=solve(n-1);
    adde(ls,rs);return ls;
}

其中 adde(x,y) 表示加入一条连接 x,yx,y 的边。

可以发现,如果运行 solve(n) 可以得到一棵有 2n2^n 个点的树,这棵树从 00 开始编号,【】在 adde 中加入了输出,并把输出重定向到了一个文件,接着调用 solve(1e6) ,然后【】的硬盘就寄掉了。

但是他决定继续思考得到的树。他想知道给出 x,dx,d 的情况下,树上有多少个点 yy 满足 x,yx,y 在树上的最短路长度等于 dd。输出对 998244353998244353 取模的结果。

然而 xx 可能非常大,所以【】会以以下方式给出 xx

对于第 ii 次询问,给出 kik_i 以及 kik_i 个两两不同的非负整数 v1,...vkiv_1,...v_{k_i} 表示 xx 的二进制中为 11 的位为 v1,...vkiv_1,...v_{k_i}

保证 vv 递增

【输入格式】

第一行包含两个非负整数 n,qn,q

接下来 qq 行,每行包含一次询问。

这部分的第 ii 行首先包含一个非负整数 kik_i,接下来 kik_i 个非负整数 v1,...vkiv_1,...v_{k_i},最后一个正整数 did_i,表示询问树上与 xx 距离等于 did_i 的点数。

【输出格式】

输出 qq 行,表示每次询问的答案对 998244353998244353 取模的结果。

【样例】

4 5
1 1 1
2 0 2 2
3 0 2 3 3
0 2
4 0 1 2 3 5
2
2
4
6
4

询问为 (2,1),(5,2),(13,3),(0,2),(15,5)(2,1),(5,2),(13,3),(0,2),(15,5)

【数据范围】

对于所有数据,保证 1n1071\leq n\leq 10^71q2×1051\leq q\leq 2\times 10^50ki1060\leq \sum k_i\leq 10^61di2n1\leq d_i\leq 2n

子任务编号 特殊限制 分值
11 q=0q=0 55
22 n10,q1000n\leq 10,q\leq 1000 1515
33 n18n\leq 18
44 n,q1000n,q\leq 1000 2020
55 n105n\leq 10^5 1515
66 n106n\leq 10^6 2020
77 无特殊限制 1010