# Maximum set bit count from pairs of integers from 0 to N that yields a sum as N

• Last Updated : 10 May, 2021

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 the 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 ` `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;` `}`

## Java

 `// Java program to implement the` `// above approach` `import` `java.util.*;`   `class` `GFG {`   `// Function to find the first number` `static` `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 != ``0``) ` `    ``{`   `        ``// Update the first number` `        ``ans = ans << ``1``;` `        ``ans = ans + ``1``;`   `        ``// Increment length` `        ``length++;`   `        ``// Update the frequency` `        ``if` `((n & ``1``) == ``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` `static` `int` `maxSetBits(``int` `n)` `{` `    `  `    ``// First value of pair` `    ``int` `first = create_first_no(n);`   `    ``// Second value of pair` `    ``int` `second = n - first;`   `    ``// Integer.bitCount() is inbuilt` `    ``// function to count the number of set bits` `    ``int` `freq_first = Integer.bitCount(first);` `    ``int` `freq_second = Integer.bitCount(second);`   `    ``// Return the sum of freq of setbits` `    ``return` `freq_first + freq_second;` `}`   `// Driver code` `public` `static` `void` `main(String[] args)` `{` `    ``int` `N = ``5``;` `    `  `    ``// Function call` `    ``System.out.println(maxSetBits(N));` `}` `}`   `// This code is contributed by offbeat`

## Python3

 `# Python3 program for the ` `# above approach`   `# Function to find the` `# first number` `def` `create_first_no(n):`   `    ``# Length of the binary` `    ``# from` `    ``length ``=` `0`   `    ``# Number of set bits` `    ``freq_set_bits ``=` `0` `    ``ans ``=` `0` `    ``while` `(n !``=` `0``):`   `        ``# Update the first number` `        ``ans ``=` `ans << ``1` `        ``ans ``=` `ans ``+` `1`   `        ``# Increment length` `        ``length ``+``=` `1`   `        ``# Update the frequency` `        ``if` `((n & ``1``) !``=` `0``):` `            ``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` `def` `maxSetBits(n):`   `    ``# First value of pair` `    ``first ``=` `create_first_no(n)`   `    ``# Second value of pair` `    ``second ``=` `n ``-` `first`   `    ``# __builtin_popcount() is ` `    ``# inbuilt function to count ` `    ``# the number of set bits` `    ``freq_first ``=` `bin``(first).count(``'1'``)` `    ``freq_second ``=` `bin``(second).count(``'1'``)`   `    ``# Return the sum of ` `    ``# freq of setbits` `    ``return` `(freq_first ``+` `            ``freq_second)`   `# Driver code` `N ``=` `5`   `# Function call` `print``(maxSetBits(N))`   `# This code is contributed by divyeshrabadiya07`

## C#

 `// C# program to implement the` `// above approach` `using` `System;` `using` `System.Linq; ` `class` `GFG {` ` `  `// Function to find the first number` `static` `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 != 0) ` `    ``{` ` `  `        ``// Update the first number` `        ``ans = ans << 1;` `        ``ans = ans + 1;` ` `  `        ``// Increment length` `        ``length++;` ` `  `        ``// Update the frequency` `        ``if` `((n & 1) == 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;` `}` `public` `static` `int` `countSetBits(``int` `n) ` `{ `   `  ``// base case ` `  ``if` `(n == 0) ` `    ``return` `0; `   `  ``else`   `    ``// if last bit set ` `    ``// add 1 else add 0 ` `    ``return` `(n & 1) + countSetBits(n >> 1); ` `} `   `// Function to calculate maximum` `// set bit frequency sum` `static` `int` `maxSetBits(``int` `n)` `{` `     `  `    ``// First value of pair` `    ``int` `first = create_first_no(n);` ` `  `    ``// Second value of pair` `    ``int` `second = n - first;` ` `  `    ``//countSetBits function to ` `    ``//count the number of set bits` `    ``int` `freq_first = countSetBits(first);` `    ``int` `freq_second = countSetBits(second);` ` `  `    ``// Return the sum of freq of setbits` `    ``return` `freq_first + freq_second;` `}` ` `  `// Driver code` `public` `static` `void` `Main(``string``[] args)` `{` `    ``int` `N = 5;` `     `  `    ``// Function call` `    ``Console.Write(maxSetBits(N));` `}` `}` ` `  `// This code is contributed by Ritik Bansal`

## Javascript

 ``

Output:

`3`

Time Complexity: O(logN)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up
Recommended Articles
Page :