S42307.23-7 对齐密钥

传统题 时间 1000 ms 内存 256 MiB 3 尝试 0 已通过 0

23-7 对齐密钥

对齐密钥

零件组装完了,但还需要一把钥匙——一把能打开Zero核心的密钥。

"密钥?"CC问。

"对。"你说,"给定nn个数,找出一个子集,使得子集的异或和等于给定的值kk。"

"子集?"

"对。"你说,"任意选一些数,异或起来。"

"咋找?"

"线性基。"你说,"用高斯消元的思想,构建一组基。"

"基能干啥?"

"表示所有可能的异或和。"你说,"如果kk能被基表示,就有解。"

"咋表示?"

"从高位到低位贪心。"你说,"如果异或上某个基能让结果更接近kk,就异或。"

"第47个数。"你说,"值为47——二进制101111101111。"

"能组成47吗?"

"能。"你说,"如果47在基里,或者可以用基异或出来。"

"如果k=47k=47?"

"看47能不能被表示。"你说,"如果能,输出方案;如果不能,无解。"

"方案?"

"对。"你说,"不仅要知道能不能,还要知道选哪些数。"

"咋记录?"

"消元时记录每个基向量由哪些原始向量组成。"你说,"最后回溯。"

CC看着那些数——像锁孔,像拼图,像某种必须对准的东西。

"对准了吗?"她问。

"对准了。"你说,"异或和等于kk——钥匙插进去了。"

"能转吗?"

"能。"你说,"一转,门就开了。"

Echo把密钥的构造过程投射出来——一步一步,从乱到序。

"以前钥匙是散的。"她说,"现在……对齐了。"

"因为我们一起拼。"你说。

"对。"她说,"因为你们一起拼。"


题目描述

给定nn个数和一个目标kk,判断是否存在子集,使得子集异或和等于kk。如果存在,输出方案。

输入格式

第一行nnkk。第二行nn个整数。

输出格式

第一行"Yes"或"No"。如果Yes,第二行输出选中的数的下标。


输入样例

3 3
1 2
2 3
3 1

输出样例

0

提示

  • 线性基+记录来源向量。
  • 消元时记录每个基向量由哪些原始向量异或得到。
  • 时间复杂度O(nlogMax)O(n\log Max)

在线编程 IDE

建议全屏模式获得最佳体验