【问题标题】:Algorithm: constrained XOR of numbers within a range算法:限制范围内的数字异或
【发布时间】:2016-08-31 11:22:00
【问题描述】:

假设我们有一个数字 n。 我们需要找到位于 [L, R] 范围内的值 S ^ (S+n) 的数量。 (其中 S 是任何非负整数,^ 是按位异或运算符)。

如果 n 是 2 的幂,我可以轻松做到这一点(它们有一个非常有用的模式)

我不确定如何为任何一般的 n 解决这个问题。 有什么建议吗?

编辑:

n 也是一个非负整数。 n、L、R 均小于 10^18。

这是我在某个练习测试中给出的一个编程问题,我只是记得今天在 StackOverflow 上看到了一个类似的问题。

编辑 2: 举例说明, 说 n = 1。 然后我们知道 S ^ (S + 1) 将始终具有全为的二进制表示。例如:1,3,7,...

所以解决这个问题很容易,我们只需要在 [L,R] 范围内计算此类数字的数量就可以了。

对于 n = 2 的任何幂,类似的方法都有效。但是如果 n 不是 2 的幂,我不知道该怎么办。

【问题讨论】:

  • 你能举个例子吗
  • n 也是非负整数吗?
  • 关于 L、R 和 n 是否有任何额外的限制?你的问题的背景是什么?
  • 我编辑了问题以解决您的所有问题

标签: algorithm xor


【解决方案1】:

C(n) 成为(无限)一组数字,对于某些S,可以写成S ^ (S + n)

我们在集合C(n)上有以下递归关系:

  • 如果n = 2k是偶数,那么C(n) = {2x : x in C(k)};
  • 如果n = 2k + 1 是奇数,那么C(n) = {2x + 1 : x in C(k)} union {2x + 1 : x in C(k + 1)}

可以从这些关系推导出算法。更准确地说,可以从(C(n / 2), C(n / 2 + 1)) 推导出一对(C(n), C(n + 1))。请注意,上面的union 实际上是一个不相交的联合,因为C(n) 中的每个元素都与n 具有相同的奇偶性,因此C(k)C(k + 1) 不相交。


递归关系的证明:

只需查看nS 的最后一个二进制数字。

【讨论】:

  • 不错!谢谢,现在我要做的就是限制范围,应该不是什么大问题!
猜你喜欢
  • 2017-12-17
  • 2015-04-06
  • 1970-01-01
  • 2018-12-26
  • 2015-10-22
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多