计算序列1,2,3,4,5 ...(直到n)的子集数量,使子集中所有元素的XOR为奇数

时间:2016-03-09 06:45:41

标签: c++ algorithm math xor

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

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

答案是:4

(1},{3},{1,2},{3,2}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果设置了最后一位,则数字为奇数。我们可以使用以下观察结果:

首先将数字分成偶数和奇数。显然,会有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)种组合。

答案 2 :(得分:0)

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

结束

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

考虑使用m偶数和n奇数

的集合

由于XOR是可交换和关联的,因此XOR的顺序并不重要,我们可以观察到以下内容:

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

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

  3. 结合1和2,当整个集合XOR时,我们将得到一个奇数。

    现在,有多少种组合?

    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