#P11478. [2023省队模拟]矩阵补全

[2023省队模拟]矩阵补全

题目描述

本来今天小 QQ 是想让你补全一个矩阵的,但是他突然发现自己把矩阵剩下部分的信息也搞丢了。

具体来讲,他的矩阵是一个 nnmm 列的 0101 矩阵 AA (下标从 00 开始),有如下性质:

1.1. 把每一行的值拼起来形成一个二进制数,那么这个数属于一个给定的集合 SS ,即满足

$$\forall 0 \le i \lt n, S \ni \sum\limits^{m-1}_{j=0} a_{ij}2^j $$

2.2. 对于每一列的性质,我们用两个长度为 mm 的数组 bbbi[0,3]b_i \in [0, 3] )和 ccci[0,1]ci \in [0, 1] )来描述。对于每个 0i<m0 \le i \lt m

• 若 bi=0b_i = 0 ,则满足第 ii 列的每个元素都等于 cic_i ; • 若 bi=1b_i = 1 ,则满足第 ii 列的所有元素的 按位或 和等于 cic_i ; • 若 bi=2b_i = 2 ,则满足第 ii 列的所有元素的 按位与 和等于 cic_i ; • 若 bi=3b_i = 3 ,则满足第 ii 列的所有元素的 按位异或 和等于 cic_i

不幸的是,小 QQ 把数组 cc 也给搞忘了,只记得 SSbb ,所以你需要帮助他回忆起数组 cc

具体而言,他会向你询问 QQ 次,每次给出一个可能的 cc ,你需要回答满足条件的矩阵的个数。

输入格式

第一行两个正整数 nnmm ,表示矩阵的行数和列数; 第二行一个长度为 2m2^m0101 字符串 TT ,第 ii 个位置为 11 表示 iS(0i<2m)i \in S(0 \le i \lt 2^m) ,易知不在此范围的数不影响答案; 第三行 mm 个数表示数组 bb ; 第四行一个正整数 QQ ,表示询问次数; 接下来 QQ 行,每行一个整数 xx ,表示把给出的数组 cc 拼成二进制数的结果,即满足 x=i=0m1ci2ix =\sum^{m-1}_{i=0}c_i2^i

输出格式

对于每次询问,输出满足条件的矩阵个数。由于数值可能很大,你只需要输出答案取模 109+710^9 + 7 的结果。

数据范围

对于所有测试点:对于所有测试点, $1 \le n \le 10^9, 1 \le m \le 20, 1 \le Q \le 10^5, b_i \in [0, 3], 0 \le x \lt 2^m$ 。

每个测试点的具体限制见下表:

测试点编号 nn \le mm \le bib_i \in
151 \sim 5 3030 1010 {0,1,2,3}\{0, 1, 2, 3\}
6106 \sim 10 10910^9
111511 \sim 15 2020 {1}\{1\}
162016 \sim 20 1717 {0,1}\{0, 1\}
212521 \sim 25 2020
263526 \sim 35 1717 {0,1,2,3}\{0, 1, 2, 3\}
365036 \sim 50 2020

输入样例 1

2 2
0101
1 2
4
0
1
2
3

输出样例 1

0
3
0
1