Count of pairs in an Array with same number of set bits

Given an array arr containing N integers, the task is to count the possible number of pairs of elements with the same number of set bits.
Examples:
Input: N = 8, arr[] = {1, 2, 3, 4, 5, 6, 7, 8}
Output: 9
Explanation:
Elements with 1 set bit: 1, 2, 4, 8
Elements with 2 set bits: 3, 5, 6
Elements with 3 set bits: 7
Hence, {1, 2}, {1, 4}, {1, 8}, {2, 4}, {2, 8}, {4, 8}, {3, 5}, {3, 6}, and {5, 6} are the possible such pairs.Input: N = 12, arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
Output: 22
Approach:
- Precompute and store the set bits for all numbers up to the maximum element of the array in bitscount[]. For all powers of 2, store 1 at their respective index. After that, compute the set bits count for the remaining elements by the relation:
bitscount[i] = bitscount[previous power of 2] + bitscount[i – previous power of 2]
- Store the frequency of set bits in the array elements in a Map.
- Add the number of possible pairs for every set bit count. If X elements have the same number of set bits, the number of possible pairs among them is X * (X – 1) / 2.
- Print the total count of such pairs.
The below code is the implementation of the above approach:
C++14
// C++ Program to count// possible number of pairs// of elements with same// number of set bits.#include <bits/stdc++.h>using namespace std;// Function to return the// count of Pairsint countPairs(int arr[], int N){ // Get the maximum element int maxm = *max_element(arr, arr + N); int i, k; // Array to store count of bits // of all elements upto maxm int bitscount[maxm + 1] = { 0 }; // Store the set bits // for powers of 2 for (i = 1; i <= maxm; i *= 2) bitscount[i] = 1; // Compute the set bits for // the remaining elements for (i = 1; i <= maxm; i++) { if (bitscount[i] == 1) k = i; if (bitscount[i] == 0) { bitscount[i] = bitscount[k] + bitscount[i - k]; } } // Store the frequency // of respective counts // of set bits map<int, int> setbits; for (int i = 0; i < N; i++) { setbits[bitscount[arr[i]]]++; } int ans = 0; for (auto it : setbits) { ans += it.second * (it.second - 1) / 2; } return ans;}int main(){ int N = 12; int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; cout << countPairs(arr, N); return 0;} |
Java
// Java program to count possible // number of pairs of elements // with same number of set bitsimport java.util.*;import java.lang.*;class GFG{ // Function to return the // count of Pairs static int countPairs(int []arr, int N) { // Get the maximum element int maxm = arr[0]; for(int j = 1; j < N; j++) { if (maxm < arr[j]) { maxm = arr[j]; } } int i, k = 0; // Array to store count of bits // of all elements upto maxm int[] bitscount = new int[maxm + 1]; Arrays.fill(bitscount, 0); // Store the set bits // for powers of 2 for(i = 1; i <= maxm; i *= 2) bitscount[i] = 1; // Compute the set bits for // the remaining elements for(i = 1; i <= maxm; i++) { if (bitscount[i] == 1) k = i; if (bitscount[i] == 0) { bitscount[i] = bitscount[k] + bitscount[i - k]; } } // Store the frequency // of respective counts // of set bits Map<Integer, Integer> setbits = new HashMap<>(); for(int j = 0; j < N; j++) { setbits.put(bitscount[arr[j]], setbits.getOrDefault( bitscount[arr[j]], 0) + 1); } int ans = 0; for(int it : setbits.values()) { ans += it * (it - 1) / 2; } return ans; } // Driver codepublic static void main(String[] args){ int N = 12; int []arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; System.out.println(countPairs(arr, N)); }}// This code is contributed by offbeat |
Python3
# Python3 program to count possible number# of pairs of elements with same number# of set bits. # Function to return the# count of Pairsdef countPairs(arr, N): # Get the maximum element maxm = max(arr) i = 0 k = 0 # Array to store count of bits # of all elements upto maxm bitscount = [0 for i in range(maxm + 1)] i = 1 # Store the set bits # for powers of 2 while i <= maxm: bitscount[i] = 1 i *= 2 # Compute the set bits for # the remaining elements for i in range(1, maxm + 1): if (bitscount[i] == 1): k = i if (bitscount[i] == 0): bitscount[i] = (bitscount[k] + bitscount[i - k]) # Store the frequency # of respective counts # of set bits setbits = dict() for i in range(N): if bitscount[arr[i]] in setbits: setbits[bitscount[arr[i]]] += 1 else: setbits[bitscount[arr[i]]] = 1 ans = 0 for it in setbits.values(): ans += it * (it - 1) // 2 return ans # Driver Codeif __name__=='__main__': N = 12 arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ] print(countPairs(arr, N)) # This code is contributed by pratham76 |
C#
// C# program to count// possible number of pairs// of elements with same// number of set bits.using System; using System.Collections; using System.Collections.Generic; using System.Text; class GFG{ // Function to return the// count of Pairsstatic int countPairs(int []arr, int N){ // Get the maximum element int maxm = -int.MaxValue; for(int j = 0; j < N; j++) { if (maxm < arr[j]) { maxm = arr[j]; } } int i, k = 0; // Array to store count of bits // of all elements upto maxm int []bitscount = new int[maxm + 1]; Array.Fill(bitscount, 0); // Store the set bits // for powers of 2 for(i = 1; i <= maxm; i *= 2) bitscount[i] = 1; // Compute the set bits for // the remaining elements for(i = 1; i <= maxm; i++) { if (bitscount[i] == 1) k = i; if (bitscount[i] == 0) { bitscount[i] = bitscount[k] + bitscount[i - k]; } } // Store the frequency // of respective counts // of set bits Dictionary<int, int> setbits = new Dictionary<int, int>(); for(int j = 0; j < N; j++) { if (setbits.ContainsKey(bitscount[arr[j]])) { setbits[bitscount[arr[j]]]++; } else { setbits[bitscount[arr[j]]] = 1; } } int ans = 0; foreach(KeyValuePair<int, int> it in setbits) { ans += it.Value * (it.Value - 1) / 2; } return ans;} // Driver Codepublic static void Main(string[] args){ int N = 12; int []arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; Console.Write(countPairs(arr, N));}}// This code is contributed by rutvik_56 |
Javascript
<script>// Javascript Program to count// possible number of pairs// of elements with same// number of set bits.// Function to return the// count of Pairsfunction countPairs(arr, N){ // Get the maximum element var maxm = arr.reduce((a,b)=>Math.max(a,b)); var i, k; // Array to store count of bits // of all elements upto maxm var bitscount = Array(maxm+1).fill(0); // Store the set bits // for powers of 2 for (i = 1; i <= maxm; i *= 2) bitscount[i] = 1; // Compute the set bits for // the remaining elements for (i = 1; i <= maxm; i++) { if (bitscount[i] == 1) k = i; if (bitscount[i] == 0) { bitscount[i] = bitscount[k] + bitscount[i - k]; } } // Store the frequency // of respective counts // of set bits var setbits = new Map(); for (var i = 0; i < N; i++) { if(setbits.has(bitscount[arr[i]])) setbits.set(bitscount[arr[i]], setbits.get(bitscount[arr[i]])+1) else setbits.set(bitscount[arr[i]], 1) } var ans = 0; setbits.forEach((value, key) => { ans += value * (value - 1) / 2; }); return ans;}var N = 12;var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];document.write( countPairs(arr, N));</script> |
Output:
22
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



