2024-06-16 08:42:51 发布
网友
我是位运算新手我有这个问题,我不知道如何解决它问题 找到异或等于一个值(比如n)的对,并返回最小差异对
example n=5 possible pairs are 1-4,9-12 and so on result is 4-1 as the diffrence of 4-1 is minimum
暴力不适用于这里,因为范围非常大,高达1<;n<;10^18 有什么提示吗
假设n为正。首先使用O(logn)循环将n减少到m,这是比n小2的最高幂:
n
m
m = n while m & (m-1): m = m & (m-1)
那么你的答案将是m和n-m
n-m
让我试着给出一个证明的草图:
看看为什么这适用于m ^ (n-m) == n应该很简单。现在我来证明为什么这对有最小的差异。让{}对于一些{}和{}在不丧失一般性的情况下,假设{}。我们不假定m == x,因为否则n==0。在保持m ^ x == n的同时,如果我们将它们的相同零位翻转为1,我们将它们增加相同的量,因此它们的差值m-x仍然是相同的。因此,我们也可以假设m和x上的位永远不会都是同一位置上的1。如果我们翻转在m上为0而在x上为1的位,它在x上会减少,但在m上会增加,并且差异m-x会更大。如果我们翻转在m上为1但在x上为0的位,的差异可能会更小。因此,具有最小差异的对使得我们不能进行最后的翻转,即m翻转m上的任何1位将使m < x
m ^ (n-m) == n
m == x
n==0
m ^ x == n
m-x
x
m < x
假设
n
为正。首先使用O(logn)循环将n
减少到m
,这是比n
小2的最高幂:那么你的答案将是
m
和n-m
让我试着给出一个证明的草图:
看看为什么这适用于}对于一些{}和{}在不丧失一般性的情况下,假设{}。我们不假定
m ^ (n-m) == n
应该很简单。现在我来证明为什么这对有最小的差异。让{m == x
,因为否则n==0
。在保持m ^ x == n
的同时,如果我们将它们的相同零位翻转为1,我们将它们增加相同的量,因此它们的差值m-x
仍然是相同的。因此,我们也可以假设m
和x
上的位永远不会都是同一位置上的1。如果我们翻转在m
上为0而在x
上为1的位,它在x
上会减少,但在m
上会增加,并且差异m-x
会更大。如果我们翻转在m
上为1但在x
上为0的位,的差异可能会更小。因此,具有最小差异的对使得我们不能进行最后的翻转,即m
翻转m
上的任何1位将使m < x
相关问题 更多 >
编程相关推荐