异或与位移
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\hspace{15pt}我有异或症。
\hspace{15pt}不过也没关系,我们这里有一个关于异或与位移的问题,你能够解决她吗?
\hspace{15pt}
\hspace{15pt}对于小川给定的由 n 个整数构成的序列 a=\{a_1,a_2,\cdots,a_n\} 和一个整数 k,满足 -k \lt a_i \lt ka_i \neq 0

\hspace{15pt}定义函数 F(x) 如下:
\hspace{23pt}\bullet\,B_0 = x
\hspace{23pt}\bullet\,B_i = \left(B_{i-1} \oplus \left\lfloor B_{i-1} \times 2^{a_i}\right\rfloor\right) \bmod 2^k
\hspace{23pt}\bullet\,那么 F(x) = B_n

\hspace{15pt}小川需要你回答 m 个询问,每个询问为:
\hspace{23pt}\bullet\,给定一个非负整数 y,找到一个非负整数 x 满足 0\le x<2^k 且 y=F(x) ;如果没有这样的 x,则输出 -1
\hspace{15pt}注意:我们将以无前缀 0 的二进制格式从最高位到最低位输入 y(当 y=0 时,依旧会读入一个 0),你需要以无前缀 0 的二进制格式最高位到最低位输出 x(如果答案为 -1,则直接输出 -1 即可;如果答案为 0,你依旧需要输出一个 0)。

\hspace{15pt}在本题中,\oplus 表示异或操作,\lfloor x\rfloor 表示将 x 向下取整。

输入描述:

\hspace{15pt}第一行输入三个整数 n,m,k \left(1 \le n \le 20;\ 1 \le m \le 10^3;\ 2 \le k \le 10^4\right) 代表序列种的元素数量、询问次数、序列元素的取值范围。 
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n \left(-k \lt a_i \lt k;\ a_i \neq 0\right) 代表序列中的元素。
\hspace{15pt}此后 m 行,每行最高位到最低位输入一个无前缀 0 的二进制格式的整数 y \left(0 \le y \lt 2^k\right)(当 y=0 时,依旧会读入一个 0)代表一次询问。

输出描述:

\hspace{15pt}对于每一次询问,新起一行。最高位到最低位输出一个无前缀 0 的二进制格式的整数,表示对应的询问的答案(如果答案为 -1,则直接输出 -1 即可;如果答案为 0,你依旧需要输出一个 0)。
示例1

输入

复制
3 2 3
1 2 -2
11
110

输出

复制
101
1

说明

\hspace{15pt}对于第一个询问,当 x=5 时,B=\{5,7,3,3\}F(x)=3,所以 y=F(x)=3,满足;
\hspace{15pt}对于第二个询问,当 x=1 时,B=\{1,3,7,6\}F(x)=6,所以 y=F(x)=6,满足。
示例2

输入

复制
3 1 10000
1 1 4
0

输出

复制
0