# 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++

 `// 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.

My Personal Notes arrow_drop_up 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.