【问题标题】: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计算序列 1,2,3,4,5...(最多 n)的子集数,使得子集的所有元素的 XOR 为奇数
【发布时间】:2016-03-09 06:45:41
【问题描述】:

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

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

答案是:4

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

【问题讨论】:

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

标签: c++ algorithm math xor


【解决方案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 的顺序并不重要,我们可以观察到以下几点:

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

    2. 偶数的个数对答案没有影响(我们可以选择任何可能的偶数,甚至 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 个独立部分并一个一个地计算它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多