计算序列 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 为奇数的主要内容,如果未能解决你的问题,请参考以下文章
给定有序对(跳数)的子列表列表,我如何计算通过列表的路径数(每个路径都是跳数序列)