我正在解决一个问题,我希望在这个问题中找到XOR等于N<20
的数组中P
个元素的组合数。
例如: 我们的数组是{2 4 5 2 7}
1)如果N = 2且P = 6,
答案是2(因为我们只能选择(2 x或4)= 6和(4 xor 2)= 6)
{ 2 4 5 2 7}或{2 4 5 2 7}
2)如果N = 3且P = 6
答案是1((4 x或5 x或7)= 6)
数组的大小可能非常大(大约10 ^ 6)所以我正在寻找快速算法来解决这个问题。
答案 0 :(得分:1)
编辑无效,因为N已修复
使用线性代数:
根据@blazs的建议,您可以在Z / 2Z向量空间中查看P和每个数组的数字作为向量。更重要的是,由于XOR是关联的和可交换的,你不是在寻找数组元素的组合,而是设置这些元素,并且一个集合也可以编码为一个Z / 2Z矢量。
所以你最终会得到像M * S = P这样的矩阵方程,其中P是Z / 2Z矢量格式的xor-sum,M是矩阵,其中列是Z中数组的元素/ 2Z格式,S是等式的未知数。
由于您只对解决方案空间的大小感兴趣,所以您需要做的就是找到解决方案空间的维度,然后将其提升2。
答案 1 :(得分:0)
建议的递归算法,可能比蛮力更快:
找到P的一位,即1.任何解决方案组合必须包含至少一个在该位中具有1的数字。
对于在该位上具有1的数组的每个元素K,重复:
终止案件:
请注意,XOR是关联的和可交换的,所以我们计算集合,而不是组合。