让我们说我们得到一个数字n。 我们需要找到位于[L,R]范围内的值的数量S ^(S + n)。 (其中S是任何非负整数,^是按位xor运算符)。
如果n是2的幂(他们有一个非常有用的模式),我可以很容易地做到这一点
我不知道如何解决这个问题。 有什么建议吗?
修改
n也是非负整数。 n,L,R均小于10 ^ 18。
这是我在某些实践测试中的一个编程问题,我回想一下,我记得今天在StackOverflow中看到了类似的问题。
编辑2 : 用一个例子来解释, 说n = 1。 然后我们知道S ^(S + 1)将始终具有所有1的二进制表示。例如:1,3,7,......
所以解决这个问题很简单,我们只需要在Range [L,R]中计算这些数字的数量就很简单了。
对于n = 2种类似方法的任何功率都有效。但是如果n不是2的幂,我不知道该怎么做。
答案 0 :(得分:2)
让C(n)
成为某些S ^ (S + n)
可以写为S
的(无限)数字集。
我们在集合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), C(n + 1))
推导出一对(C(n / 2), C(n / 2 + 1))
。请注意,上面的union
实际上是一个不相交的联合,因为C(n)
中的每个元素都与n
具有相同的奇偶校验,因此C(k)
和C(k + 1)
不相交
复发关系证明:
只需查看n
和S
的最后二进制数字。