Related Articles

Related Articles

Count pairs of elements such that number of set bits in their AND is B[i]
  • Difficulty Level : Medium
  • Last Updated : 18 Jun, 2019

Given two arrays A[] and B[] of N elements each. The task is to find the number of index pairs (i, j) such that i ≤ j and F(A[i] & A[j]) = B[j] where F(X) is the count of set bits in the binary representation of X.

Examples:

Input: A[] = {2, 3, 1, 4, 5}, B[] = {2, 2, 1, 4, 2}
Output: 4
All possible pairs are (3, 3), (3, 1), (1, 1) and (5, 5)

Input: A[] = {1, 2, 3, 4, 5}, B[] = {2, 2, 2, 2, 2}
Output: 2

Approach: Iterate through all the possible pairs (i, j) and check the count of set bits in their AND value. If the count is equal to B[j] then increment the count.



Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the count of pairs
// which satisfy the given condition
int solve(int A[], int B[], int n)
{
    int cnt = 0;
  
    for (int i = 0; i < n; i++)
        for (int j = i; j < n; j++)
  
            // Check if the count of set bits
            // in the AND value is B[j]
            if (__builtin_popcount(A[i] & A[j]) == B[j]) {
                cnt++;
            }
  
    return cnt;
}
  
// Driver code
int main()
{
    int A[] = { 2, 3, 1, 4, 5 };
    int B[] = { 2, 2, 1, 4, 2 };
    int size = sizeof(A) / sizeof(A[0]);
  
    cout << solve(A, B, size);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
public class GFG 
{
  
    // Function to return the count of pairs
    // which satisfy the given condition
    static int solve(int A[], int B[], int n) 
    {
        int cnt = 0;
  
        for (int i = 0; i < n; i++) 
        {
            for (int j = i; j < n; j++) // Check if the count of set bits
            // in the AND value is B[j]
            {
                if (Integer.bitCount(A[i] & A[j]) == B[j]) 
                {
                    cnt++;
                }
            }
        }
  
        return cnt;
    }
  
    // Driver code
    public static void main(String[] args) 
    {
        int A[] = {2, 3, 1, 4, 5};
        int B[] = {2, 2, 1, 4, 2};
        int size = A.length;
  
        System.out.println(solve(A, B, size));
    }
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
  
# Function to return the count of pairs 
# which satisfy the given condition 
def solve(A, B, n) : 
    cnt = 0
  
    for i in range(n) : 
        for j in range(i, n) : 
  
            # Check if the count of set bits 
            # in the AND value is B[j] 
            c = A[i] & A[j]
            if (bin(c).count('1') == B[j]) :
                cnt += 1
    return cnt; 
  
# Driver code 
if __name__ == "__main__"
  
    A = [ 2, 3, 1, 4, 5 ]; 
    B = [ 2, 2, 1, 4, 2 ]; 
      
    size = len(A); 
  
    print(solve(A, B, size)); 
  
# This code is contributed 
# by AnkitRai01

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Implementation of the above approach
using System;
  
class GFG 
  
    // Function to return the count of pairs 
    // which satisfy the given condition 
    static int solve(int []A, int []B, int n) 
    
        int cnt = 0; 
  
        for (int i = 0; i < n; i++) 
        
            for (int j = i; j < n; j++) 
            // Check if the count of set bits 
            // in the AND value is B[j] 
            
                if (countSetBits(A[i] & A[j]) == B[j]) 
                
                    cnt++; 
                
            
        
  
        return cnt; 
    
      
    // Function to get no of set 
    // bits in binary representation 
    // of positive integer n 
    static int countSetBits(int n) 
    
        int count = 0; 
        while (n > 0)
        
            count += n & 1; 
            n >>= 1; 
        
        return count; 
    }
      
    // Driver code 
    public static void Main(String[] args) 
    
        int []A = {2, 3, 1, 4, 5}; 
        int []B = {2, 2, 1, 4, 2}; 
        int size = A.Length; 
  
        Console.WriteLine(solve(A, B, size)); 
    
  
// This code is contributed by Princi Singh

chevron_right


Output:

4

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :