计算序列 1,2,3,4,5...(最多 n)的子集数,使得子集的所有元素的 XOR 为奇数

Posted

技术标签:

【中文标题】计算序列 1,2,3,4,5...(最多 n)的子集数,使得子集的所有元素的 XOR 为奇数【英文标题】:Count the number of subsets of the sequence 1,2,3,4,5...(up to n) such that the XOR of all elements of the subset is an odd number 【发布时间】:2016-03-09 06:45:41 【问题描述】:

例如: 对于序列 1,2,3。

答案是:4

(1,3,1,2,3,2

【问题讨论】:

参考***.com/questions/728972/…> @KaustubhKulkarni 我不认为他们是同一个问题 OP,n的极限是多少? @shole 我相信这是这个问题的一个子问题 @Nard 这个问题完全可以通过使用一点数学来解决,而另一个则不需要 【参考方案1】:

子集应该包含奇数个奇数,因为你只关心最后一位,例如:

1 2 3 4 5 
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101

1 3 5 - cause those have '1' as last bit itself.

上面带有偶数任意组合的子集:

1,2,4 1,2 1,4 3,2,4... so another 9 subsets
1,3,5 is an odd also.
and variation with even numbers: 1,3,5,2 1,3,5,4 1,3,5,2,4 

所以答案是 16。 与c++无关

您必须按顺序计算偶数的所有可能组合(使用组合,顺序无关紧要)+ 1(使用零偶数时)。计算所有可能的奇数序列(顺序无关紧要)。结果相乘。

1 2 3 4 5
2 4 2,4  = 4 options
1 3 5 1,3,5 = 4 options
4*4 = 16

【讨论】:

我知道它与 c++ 无关。但我必须对其进行编码,因为 n 也可能非常大 Nico Schertler 给你答案 - 2^(n - 1)【参考方案2】:

如果最后一位被设置,则数字是奇数。我们可以如下使用这个观察:

首先将数字分为偶数和奇数。显然,会有e=floor(n/2)偶数和o=n-e奇数。

选择偶数不会影响结果的奇数。因此,您可以使用任何组合。有n_e = 2^e 这样的组合(其中^ 是幂运算符)。

从剩下的奇数中,你必须选择一个奇数。组合数为n_o = 2^(o-1)

总共有n_e * n_e = 2^e * 2^(o-1) = 2^(e + o - 1) = 2^(n - 1) 个组合。

【讨论】:

【参考方案3】:

首先,我们知道所有偶数都以 0(按位)结尾,所有奇数都以 1 结尾

所以这意味着只有奇数异或偶数会给我们一个奇数。

考虑一个包含m偶数和n奇数的集合,

由于 XOR 具有交换性和关联性,因此 XOR 的顺序并不重要,我们可以观察到以下几点:

    我们需要奇数个奇数(至少需要一个,它们相互异或时会给我们一个奇数)

    偶数的个数对答案没有影响(我们可以选择任何可能的偶数,甚至 0,当它们相互异或时,它们会给我们一个偶数)

    李>

结合1和2,我们对整个集合进行异或得到一个奇数。

现在,有多少种组合?

m 为偶数总数,n 为奇数总数

对于 1,有 M = mC1 + mC3 + mC5... = 2^(m-1) 选择

对于 2,有 N = nC0 + nC1 + ... = 2^n 选择

所以答案是M*N = 2^(m+n-1)

注意m+n = 你的整数范围,所以可以进一步简化为2^(size-1)

例如:1,2,3,4,5:m =2, n=3,所以答案是 2^4 = 16

【讨论】:

我喜欢将第 2 部分的计数视为包含或排除 n 个值中的每一个,这显然是 2^n 个可能性。可以类似地获得第 1 部分 - 您可以包含或排除第一个 m-1 值中的每一个,然后通过确保选择奇数来确定是否包含第 m 个值 - 这显然是 2^(m-1)可能性。 @MichaelAnderson 谢谢!子集概念的基本总数 # 在这里也有效 :) 我的意图只是展示如何分离 2 个独立部分并一个一个地计算它们

以上是关于计算序列 1,2,3,4,5...(最多 n)的子集数,使得子集的所有元素的 XOR 为奇数的主要内容,如果未能解决你的问题,请参考以下文章

给定有序对(跳数)的子列表列表,我如何计算通过列表的路径数(每个路径都是跳数序列)

算法实践--最长递增子序列(Longest Increasing Subsquence)

1050 循环数组最大子段和

中级算法5.递增的三元子序列

第k大-二分查找-1139. 第k大的子数组

简易版最长序列(map映射)