Given an **integer N, **the task is to find the maximum frequency of set bits among all pairs of integers from 0 to N that yields a sum as N.

Examples:

_Input: _N = 5

_Output: _3

Explanation:

All the pairs are {0, 5}, {1, 4}, {2, 3} which has a sum as 5.

0 (0000) and 5 (0101), number of set bit = 2

1 (0001) and 4 (0100), number of set bit = 2

2 (0010) and 3 (0011), number of set bit = 3, hence 3 is the maximum.

_Input: _N = 11

_Output: _4

Explanation:

_All the pairs are {0, 11}, {1, 10}, {2, 9}, {3, 8}, {4, 7}, {5, 6} and the maximum ans will be for the pair {4, 7} _

4 = 1000 and 7 = 0111, total number of set bits=1+3=4

**Naive Approach: **The simplest way to solve this problem is to generate all possible pairs with sum **N **and compute the maximum sum of the set bits of all such pairs, and print the maximum no of set bits sum.

**Time Complexity: **O(N * log N)

Auxiliary Space: O(1)

**Efficient Approach: **The above approach can be optimized through these steps:

  • Find a number less than equal to N whose all the bits from the Least significant bit to Most significant bit are set bits. That number will be the first number in the pair.
  • Compute the number of set bits the pair {first, N-first} and sum it up.

Below is the implementation of the above approach:

  • C++

// C++ program for the above approach

#include <bits/stdc++.h>

**using** **namespace** std;

// Function to find the first number

**int** create_first_no(``**int** n)

{

// Length of the binary from

**int** length = 0;

// Number of set bits

**int** freq_set_bits = 0;

**int** ans = 0;

**while** (n) {

// Update the first number

ans = ans << 1;

ans = ans + 1;

// Increment length

length++;

// Update the frequency

**if** ((n & 1))

freq_set_bits += 1;

n = n >> 1;

}

// Check if n does not have all the

// bits as set bits then make

// the first as less than n

**if** (length != freq_set_bits)

ans = (ans >> 1);

// Return the first value

**return** ans;

}

// Function to calculate maximum

// set bit frequency sum

**int** maxSetBits(``**int** n)

{

// First value of pair

**int** first = create_first_no(n);

// Second value of pair

**int** second = n - first;

// __builtin_popcount() is inbuilt

// function to count the number of set bits

**int** freq_first

= __builtin_popcount(first);

**int** freq_second

= __builtin_popcount(second);

// Return the sum of freq of setbits

**return** freq_first + freq_second;

}

// Driver Code

**int** main()

{

**int** N = 5;

// Function call

cout << maxSetBits(N);

**return** 0;

}

Output:

3

_Time Complexity: _O(logN)

_Auxiliary Space: _O(1)

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.

#arrays #bit magic #hash #mathematical #binary-representation #setbitcount

Maximum set bit count from pairs of integers from 0 to N
1.50 GEEK