Count pairs from an array having sum of twice of their AND and XOR equal to K
Last Updated :
13 Jul, 2021
Given an array arr[] consisting of N integers and an integer K, the task is to count the number of pairs satisfying the equation 2*(arr[i] & arr[j]) + (arr[i] ^ arr[j]) = K.
Examples:
Input: arr[] = {1, 5, 4, 8, 7}, K = 9
Output: 2
Explanation:
- Elements at index 0 and 3, i.e. arr[i] = 1, arr[j] = 8, satisfies the given equations.
- Elements at index 1 and 2, i.e. arr[i] = 5, arr[j] = 4, satisfies the given equations.
Input: arr[] = {1, 2, 2, 4, 5}, K = 3
Output: 2
Naive Approach: The simplest approach is to generate all possible pairs from the array and for each pair, check if the pair satisfies the given equation or not.
Time Complexity: O(N2)
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized based on the following observations:
Observation:
A + B = (A ^ B) + 2 * (A & B)
While calculating sum, if both bits are 1(i.e., AND is 1), the resultant bit is 0, and 1 is added as carry, which means every bit in AND is left-shifted by 1, i.e. value of AND is multiplied by 2 and added.
Therefore, A + B = given equations.
Hence, this verifies the above observation.
Follow the below steps to solve the problem:
- The problem now reduces to Two Sum problem and the task reduces to count pairs whose sum is equal to K.
- Initialize an unordered_map, say mp, and a variable, say cnt, to count the number of pairs satisfying the given conditions.
- Traverse the array and for each element:
- If mp[K – arr[i]] is not zero, then add its value to cnt.
- Update the frequency of arr[i] in Map.
- Print the cnt as the answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void countPairs( int arr[], int N, int K)
{
unordered_map< int , int > mp;
int cnt = 0;
for ( int i = 0; i < N; i++) {
cnt += mp[K - arr[i]];
mp[arr[i]]++;
}
cout << cnt;
}
int main()
{
int arr[] = { 1, 5, 4, 8, 7 };
int N = sizeof (arr) / sizeof (arr[0]);
int K = 9;
countPairs(arr, N, K);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
static void countPairs( int arr[], int N, int K)
{
Map<Integer, Integer> mp = new HashMap<>();
int cnt = 0 ;
for ( int i = 0 ; i < N; i++)
{
if (mp.get(K - arr[i]) != null )
cnt += mp.get(K - arr[i]);
mp.put(arr[i], mp.get(arr[i]) == null
? 1
: mp.get(arr[i]) + 1 );
}
System.out.println(cnt);
}
public static void main(String[] args)
{
int arr[] = { 1 , 5 , 4 , 8 , 7 };
int N = arr.length;
int K = 9 ;
countPairs(arr, N, K);
}
}
|
Python3
from collections import defaultdict
def countPairs(arr, N, K) :
mp = defaultdict( int )
cnt = 0
for i in range (N):
cnt + = mp[K - arr[i]]
mp[arr[i]] + = 1
print (cnt)
arr = [ 1 , 5 , 4 , 8 , 7 ]
N = len (arr)
K = 9
countPairs(arr, N, K)
|
C#
using System;
using System.Collections.Generic;
public class GFG
{
static void countPairs( int [] arr, int N, int K)
{
Dictionary< int , int > mp
= new Dictionary< int , int >();
int cnt = 0;
for ( int i = 0; i < N; i++) {
if (mp.ContainsKey(K - arr[i]))
cnt += mp[K - arr[i]];
if (mp.ContainsKey(arr[i])) {
var val = mp[arr[i]];
mp.Remove(arr[i]);
mp.Add(arr[i], val + 1);
}
else {
mp.Add(arr[i], 1);
}
}
Console.WriteLine(cnt);
}
static public void Main()
{
int [] arr = { 1, 5, 4, 8, 7 };
int N = arr.Length;
int K = 9;
countPairs(arr, N, K);
}
}
|
Javascript
<script>
function countPairs(arr,N,K)
{
let mp = new Map();
let cnt = 0;
for (let i = 0; i < N; i++) {
if (mp.has(K - arr[i]))
{
cnt += mp.get(K - arr[i]);
}
if (mp.has(arr[i]))
{
mp.set(arr[i], mp.get(arr[i]) + 1);
}
else {
mp.set(arr[i], 1);
}
}
document.write(cnt);
}
let arr = [ 1, 5, 4, 8, 7 ];
let N = arr.length;
let K = 9;
countPairs(arr, N, K);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...