Ridbit 有一个隐藏的长度为 n 的数组 a,Ashish 要去猜,n 是 2 的整数次幂。Ridbit 允许 Ashish 提出三种不同类型的查询。它们分别是:
-
AND i,j:求元素 ai 和 aj 每一位的 and(1≤i,j≤n,i=j)
-
OR i,j:求元素 ai 和 aj 每一位的 or(1≤i,j≤n,i=j)
-
XOR i,j:求元素 ai 和 aj 每一位的 xor(1≤i,j≤n,i=j)
限制:
- Ashish 最多可以询问 n+1 次(Hard Version)n+2 次(Easy Version)。
- 0≤ai≤n−2。
1≤n≤216。
Easy Version
发现求出 a1 就能通过异或求出剩下的数,那么考虑求 a1。
先用两次操作求出 a1⊕a2=xor12 和 a1&a2=and12。显然对于某一个二进制位 i,若 and12 的第 i 位为 1,a1 和 a2 的第 i 位也肯定为 1;若 xor12 的第 i 位为 1,a1 和 a2 之间肯定有且仅有 一个数第 i 位为 1。
考虑确定 xor12 二进制中的 1 哪些属于 a1,哪些属于 a2。显然可以再用两次操作求出 a2∣a3=or23 和 a1&a3=and13。 对于某一个满足 xor12 的第 i 位为 1 的二进制位 i,若 or23 的第 i 位为 0,那么这个 1 显然属于 a1;否则若 and13 的第 i 位为 1 那么这一个 1 属于 a1,否则这个 1 属于 a2。
这样我们就用 4 次操作求出了 a1 和 a2,接下来用 n−2 次操作即可求出整个序列 a,总共花费了 n+2 次操作。
Hard Version
先对 2≤i≤n 的 i 求出 bi=a1⊕ai,耗费 n−1 次操作。
然后考虑用 2 次操作求出 a1:
- 显然若 b 中有相同的元素或者存在 bi=0 那么可以直接花费 1 次操作求出重复的元素,然后直接异或上 bi 求出 a1。
- 否则此时 a 中元素两两不同,那么显然一定有且仅有一个 bi=1,也有且仅有一个 bj=2,那么找出 i,j,询问 a1&ai 即可确定 a1 二进制中除了最后一位的其它位,询问 a1&aj 即可确定 a1 二进制中的最后一位。