# 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 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 same number of set bits, the number of possible pairs among them is X * (X – 1) / 2.
• Print the total count of such pairs.

Below code is the implementation of the above approach:

 `// C++ Program to count ` `// possible number of pairs ` `// of elements with same ` `// number of set bits. ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Function to return the ` `// count of Pairs ` `int` `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; ` `} `

Output:
```22
```

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.

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :