📜  计算正数的有序对,使它们的和为S,异或为K

📅  最后修改于: 2021-04-27 23:52:43             🧑  作者: Mango

给定一个总和S还有一个数字K 。任务是对所有可能的正数对(a,b)进行计数,以使两个正整数ab的总和为S ,而X的按位异或。

例子

Input : S = 9, K = 5
Output : 4
The ordered pairs are  (2, 7), (3, 6), (6, 3), (7, 2)

Input : S = 2, K = 2
Output : 0
There are no such ordered pair.

方法:

对于任何两个整数ab

这是因为\oplus是非携带的二进制加法。因此,我们可以写出a&b =(SK)/ 2 ,其中S =(a + b)K =(a \oplus b)

如果(SK)为奇数或(SK)小于0,

  • 那么就没有这样的有序对。

现在,对于每一位\in {0,1}和(a \oplus b) \in {0,1}。

  • 如果一个\oplus b)= 0,那么a i = b i ,因此我们有一种可能性:a i = b i =(a i &b i )。
  • 如果一个\oplus b)= 1,那么我们必须具有(a i &b i )= 0(否则输出为0),并且我们有两个选择:(a i = 1和b i = 0)或(a i = 0且b i = 1)。

其中,a i是a中的第i位,而b i是b中的第i位。

因此,答案是2 {^p} , 在哪里p是K中的置位位数。

如果S和K相等,我们将减去2,因为a和b必须为正(> 0)。

下面是上述方法的实现:

C++
// C++ program to count ordered pairs of
// positive numbers such that their
// sum is S and XOR is K
  
#include 
using namespace std;
  
// Function to count ordered pairs of
// positive numbers such that their
// sum is S and XOR is K
int countPairs(int s, int K)
{
    // Check if no such pair exists
    if (K > s || (s - K) % 2) {
        return 0;
    }
  
    if ((s - K) / 2 & K) {
        return 0;
    }
  
    // Calculate set bits in K
    int setBits = __builtin_popcount(K);
  
    // Calculate pairs
    int pairsCount = pow(2, setBits);
  
    // If s = k, subtract 2 from result
    if (s == K)
        pairsCount -= 2;
  
    return pairsCount;
}
  
// Driver code
int main()
{
    int s = 9, K = 5;
  
    cout << countPairs(s, K);
  
    return 0;
}


Java
// Java program to count ordered pairs of 
// positive numbers such that their 
// sum is S and XOR is K 
  
class GFG {
  
// Function to count ordered pairs of 
// positive numbers such that their 
// sum is S and XOR is K 
    static int countPairs(int s, int K) {
        // Check if no such pair exists 
        if (K > s || (s - K) % 2 ==1) {
            return 0;
        }
  
        if ((s - K) / 2 == 1 & K == 1) {
            return 0;
        }
  
        // Calculate set bits in K 
        int setBits = __builtin_popcount(K);
  
        // Calculate pairs 
        int pairsCount = (int) Math.pow(2, setBits);
  
        // If s = k, subtract 2 from result 
        if (s == K) {
            pairsCount -= 2;
        }
  
        return pairsCount;
    }
  
    static int __builtin_popcount(int n) {
        /* Function to get no of set  
    bits in binary representation  
    of positive integer n */
  
        int count = 0;
        while (n > 0) {
            count += n & 1;
            n >>= 1;
        }
        return count;
    }
  
// Driver program to test above function 
    public static void main(String[] args) {
        int s = 9, K = 5;
        System.out.println(countPairs(s, K));
  
    }
  
}


Python3
# Python3 program to count ordered pairs of 
# positive numbers such that their 
# sum is S and XOR is K 
  
# Function to count ordered pairs of 
# positive numbers such that their 
# sum is S and XOR is K 
def countPairs(s,K):
    if(K>s or (s-K)%2==1):
        return 0
          
    # Calculate set bits in k
    setBits=(str(bin(K))[2:]).count("1")
  
    # Calculate pairs
    pairsCount = pow(2,setBits)
  
    # If s = k, subtract 2 from result
    if(s==K):
        pairsCount-=2
  
    return pairsCount
  
# Driver code
if __name__=='__main__':
    s,K=9,5
    print(countPairs(s,K))
  
# This code is contributed by 
# Indrajit Sinha.


C#
// C# program to count ordered pairs 
// of positive numbers such that their 
// sum is S and XOR is K 
using System;
                      
class GFG
{
  
// Function to count ordered pairs of 
// positive numbers such that their 
// sum is S and XOR is K 
static int countPairs(int s, int K)
{
    // Check if no such pair exists 
    if (K > s || (s - K) % 2 ==1) 
    {
        return 0;
    }
  
    if ((s - K) / 2 == 1 & K == 1)
    {
        return 0;
    }
  
    // Calculate set bits in K 
    int setBits = __builtin_popcount(K);
  
    // Calculate pairs 
    int pairsCount = (int) Math.Pow(2, setBits);
  
    // If s = k, subtract 2 from result 
    if (s == K) 
    {
        pairsCount -= 2;
    }
  
    return pairsCount;
}
  
static int __builtin_popcount(int n) 
{
    /* Function to get no of set 
    bits in binary representation 
    of positive integer n */
    int count = 0;
    while (n > 0) 
    {
        count += n & 1;
        n >>= 1;
    }
    return count;
}
  
// Driver Code
public static void Main()
{
    int s = 9, K = 5;
    Console.Write(countPairs(s, K)); 
}
}
  
// This code is contributed 
// by Rajput-Ji


PHP
 $s || ($s - $K) % 2 == 1)
    {
        return 0;
    }
  
    if (($s - $K) / 2 == 1 & $K == 1)
    {
        return 0;
    }
  
    // Calculate set bits in K 
    $setBits = __builtin_popcount($K);
  
    // Calculate pairs 
    $pairsCount = (int)pow(2, $setBits);
  
    // If s = k, subtract 2 from result 
    if ($s == $K) 
    {
        $pairsCount -= 2;
    }
  
    return $pairsCount;
}
  
function __builtin_popcount($n)
{
    /* Function to get no of set 
    bits in binary representation 
    of positive integer n */
    $count = 0;
    while ($n > 0) 
    {
        $count += $n & 1;
        $n >>= 1;
    }
    return $count;
}
  
// Driver Code
$s = 9; $K = 5;
echo countPairs($s, $K) . "\n";
  
// This code is contributed 
// by Akanksha Rai


输出:
4

时间复杂度: O(log(K))