Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定两个数的异或和,如何找到满足它们的对数?_Algorithm_Math - Fatal编程技术网

Algorithm 给定两个数的异或和,如何找到满足它们的对数?

Algorithm 给定两个数的异或和,如何找到满足它们的对数?,algorithm,math,Algorithm,Math,我认为这个问题可能有点令人困惑。所以,我先解释一下 假设给定了两个数的异或和。(请注意,有多对可能满足此要求。) 例如,如果XOR为5且总和为9,则存在满足总和和XOR的4对。它们是(2, 7) ,(3, 6) ,(6, 3) ,(7, 2) 。所以2+7=9和2^7=5 我只想找到满足和和和异或的对的数目。因此,在我提到的示例中,答案4就足够了。我不需要知道哪对能满足他们 我把这个问题从我的电脑上解决了 我查了一下答案。它提供了一个O(n)解决方案,这是不够的 有一篇社论提供了这个问题的解决办

我认为这个问题可能有点令人困惑。所以,我先解释一下

假设给定了两个数的异或和。(请注意,有多对可能满足此要求。)

例如,如果XOR为
5
且总和为
9
,则存在满足总和和XOR的
4
对。它们是
(2, 7) 
(3, 6) 
(6, 3) 
(7, 2) 
。所以
2+7=9
2^7=5

我只想找到满足和和和异或的对的数目。因此,在我提到的示例中,答案
4
就足够了。我不需要知道哪对能满足他们

我把这个问题从我的电脑上解决了

我查了一下答案。它提供了一个O(n)解决方案,这是不够的

有一篇社论提供了这个问题的解决办法。可以找到它。(寻找627A的解决方案)

问题是我不明白解决办法。从我的总结来看,他们使用了这样一个公式,
(如果有两个数字a和b)然后,
a+b=(a或b)+(a和b)*2

我怎样才能做到这一点?其余的步骤我都不清楚


如果有人能提供解决方法或解释他们的解决方案,请提供帮助。

a和b是两个数字中的位。因此,它们的总数增加了一倍
a XOR b
是仅存在于其中一个数字中的位,因此这些位在总和中只应计数一次

以下是一个例子:

  • a=4=1*2^2+0*2^1+0*2^0(或仅100)
  • b=13=1*2^3+1*2^2+0*2^1+1*2^0(或仅1101)
  • a+b=(1*2^2+0*2^1+0*2^0)+(1*2^3+1*2^2+0*2^1+1*2^0)=1*2^3+2*2^2+0*2^1+1*2^0
注意最后一行,两个数字(
2^2
)中的位在总和中是如何计数两次的,而其余的只计数一次

要解决你的问题,你需要找到所有的对(a,b)的总和。您要做的是:

  • 从总和中减去XOR值。剩下的是
    2*(a和b)
  • 除以2。您现在拥有了a和b中应设置的所有位
  • 因为你有一个异或值,你就知道应该在a和b中的某个位置设置哪些位,而你刚才计算的和值就是应该在这两个位置设置的位。因此,您可以分别列出a或b中设置位的所有排列
  • 要继续我前面的示例,请执行以下操作:

    • a和b=0100
      (始终在这两个字段中设置)
    • a XOR b=1001
      (我们需要尝试所有这些排列)
    我们将这些排列作为解决方案:

    • a=0100+0000=0100,b=0100+1001=1101=>(4,13)
    • a=0100+0001=0101,b=0100+1000=1100=>(5,12)
    • a=0100+1000=1100,b=0100+0001=0101=>(12,5)
    • a=0100+1001=1101,b=0100+0000=0100=>(13,4)
    a+b=(a XOR b)+(a和b)*2想象成进行二进制加法时发生的情况。根据您的示例,
    a=010
    b=111

     010
     111
     ---
    1001 = 101 + 100
    
    对于每个位,添加
    a
    b
    0+0=0
    0+1=1
    1+0=1
    1+1=0
    ,这正是
    a异或b
    加上上上上一次加法的进位,也就是说,如果
    a
    b
    的前两位都是1,那么我们也加上它。这正是
    a和b)*2
    。(请记住,乘以2等于向左移位。)

    用这个方程我们可以计算a和b

    现在,为了计算您想要的数字,我们逐个查看
    a异或b
    a和b
    的每个位,并将所有可能性相乘。(让我为
    i
    a
    的第位
    a

    • 如果
      a[i]XOR b[i]=0
      a[i]和b[i]=0
      ,则
      a[i]=b[i]=0
      。此位只有一种可能性

    • 如果
      a[i]XOR b[i]=0
      a[i]和b[i]=1
      ,则
      a[i]=b[i]=1
      。此位只有一种可能性

    • 如果
      a[i]XOR b[i]=1
      a[i]和b[i]=0
      ,则
      a[i]=1
      b[i]=0
      ,反之亦然。两种可能性

    • 不可能有
      a[i]XOR b[i]=1
      a[i]和b[i]=1


    从你的例子中,
    a XOR b=101
    a和b=010
    。我们得到了答案
    2*1*2=4

    好的,我理解这一部分。那么我如何使用这个公式来解决这个问题呢?我的意思是如何计算满足和和和和XOR的对数?这是一个漂亮的解决方案!)。谢谢!作为旁注,如果我们可以保证存在一对,那么我们可以说
    (s-b)/2
    a
    的最小可能值(
    s
    是预期的和,
    b
    是预期的
    按位异或
    值:如中所述)?