Minimum number N such that total set bits of all numbers from 1 to N is at-least X

Given a number X, the task is to find the minimum number N such that total set bits of all numbers from 1 to n is atleast X.

Examples:

```Input: x = 5
Output: 4
Set bits in 1-> 1
Set bits in 2-> 1
Set bits in 3-> 2
Set bits in 4-> 1
Hence first four numbers add upto 5

Input: x = 20
Output: 11
```

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Use binary search to get the minimum most number whose sum of bits till N is atleast X. At start, low is 0 and high is initialized according to the constraint. Check if count of set bits is atleast X, every time it is, change high to mid-1, else change it to mid+1. Everytime we do high = mid-1, store the minimal of answer.

Below is the implementation of the above approach:

C++

 `// C++ implementation of the above approach ` `#include ` `using` `namespace` `std; ` `#define INF 99999 ` `#define size 10 ` ` `  `// Function to count sum of set bits ` `// of all numbers till N ` `int` `getSetBitsFromOneToN(``int` `N) ` `{ ` `    ``int` `two = 2, ans = 0; ` `    ``int` `n = N; ` ` `  `    ``while` `(n) { ` `        ``ans += (N / two) * (two >> 1); ` ` `  `        ``if` `((N & (two - 1)) > (two >> 1) - 1) ` `            ``ans += (N & (two - 1)) - (two >> 1) + 1; ` ` `  `        ``two <<= 1; ` `        ``n >>= 1; ` `    ``} ` `    ``return` `ans; ` `} ` ` `  `// Function to find the minimum number ` `int` `findMinimum(``int` `x) ` `{ ` `    ``int` `low = 0, high = 100000; ` ` `  `    ``int` `ans = high; ` ` `  `    ``// Binary search for the lowest number ` `    ``while` `(low <= high) { ` ` `  `        ``// Find mid number ` `        ``int` `mid = (low + high) >> 1; ` ` `  `        ``// Check if it is atleast x ` `        ``if` `(getSetBitsFromOneToN(mid) >= x) { ` `            ``ans = min(ans, mid); ` `            ``high = mid - 1; ` `        ``} ` `        ``else` `            ``low = mid + 1; ` `    ``} ` ` `  `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` `    ``int` `x = 20; ` `    ``cout << findMinimum(x); ` ` `  `return` `0; ` `} `

Java

 `// Java implementation of the above approach ` `import` `java.util.*; ` ` `  `class` `solution ` `{ ` `static` `int` `INF = ``99999``; ` `static` `int` `size = ``10``; ` ` `  `// Function to count sum of set bits ` `// of all numbers till N ` `static` `int` `getSetBitsFromOneToN(``int` `N) ` `{ ` `    ``int` `two = ``2``, ans = ``0``; ` `    ``int` `n = N; ` ` `  `    ``while` `(n!=``0``) { ` `        ``ans += (N / two) * (two >> ``1``); ` ` `  `        ``if` `((N & (two - ``1``)) > (two >> ``1``) - ``1``) ` `            ``ans += (N & (two - ``1``)) - (two >> ``1``) + ``1``; ` ` `  `        ``two <<= ``1``; ` `        ``n >>= ``1``; ` `    ``} ` `    ``return` `ans; ` `} ` ` `  `// Function to find the minimum number ` `static` `int` `findMinimum(``int` `x) ` `{ ` `    ``int` `low = ``0``, high = ``100000``; ` ` `  `    ``int` `ans = high; ` ` `  `    ``// Binary search for the lowest number ` `    ``while` `(low <= high) { ` ` `  `        ``// Find mid number ` `        ``int` `mid = (low + high) >> ``1``; ` ` `  `        ``// Check if it is atleast x ` `        ``if` `(getSetBitsFromOneToN(mid) >= x) { ` `            ``ans = Math.min(ans, mid); ` `            ``high = mid - ``1``; ` `        ``} ` `        ``else` `            ``low = mid + ``1``; ` `    ``} ` ` `  `    ``return` `ans; ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String args[]) ` `{ ` `    ``int` `x = ``20``; ` `    ``System.out.println(findMinimum(x)); ` ` `  `} ` ` `  `} ` ` `  `//This code is contributed by  ` `// Shashank_Sharma `

Python3

 `# Python3 implementation of the  ` `# above approach ` `INF ``=` `99999` `size ``=` `10` ` `  `# Function to count sum of set bits ` `# of all numbers till N ` `def` `getSetBitsFromOneToN(N): ` ` `  `    ``two, ans ``=` `2``, ``0` `    ``n ``=` `N ` ` `  `    ``while` `(n > ``0``): ` `        ``ans ``+``=` `(N ``/``/` `two) ``*` `(two >> ``1``) ` ` `  `        ``if` `((N & (two ``-` `1``)) > (two >> ``1``) ``-` `1``): ` `            ``ans ``+``=` `(N & (two ``-` `1``)) ``-` `(two >> ``1``) ``+` `1` ` `  `        ``two <<``=` `1` `        ``n >>``=` `1` `    ``return` `ans ` ` `  `# Function to find the minimum number ` `def` `findMinimum(x): ` ` `  `    ``low ``=` `0` `    ``high ``=` `100000` ` `  `    ``ans ``=` `high ` ` `  `    ``# Binary search for the lowest number ` `    ``while` `(low <``=` `high):  ` ` `  `        ``# Find mid number ` `        ``mid ``=` `(low ``+` `high) >> ``1` ` `  `        ``# Check if it is atleast x ` `        ``if` `(getSetBitsFromOneToN(mid) >``=` `x): ` ` `  `            ``ans ``=` `min``(ans, mid) ` `            ``high ``=` `mid ``-` `1` `        ``else``: ` `            ``low ``=` `mid ``+` `1` `     `  `    ``return` `ans ` ` `  `# Driver Code ` `x ``=` `20` `print``(findMinimum(x)) ` ` `  `# This code is contributed by ` `# Mohit kumar 29 `

C#

 `// Csharp implementation of the above approach  ` `using` `System ; ` ` `  `class` `solution  ` `{  ` `static` `int` `INF = 99999;  ` `static` `int` `size = 10;  ` ` `  `// Function to count sum of set bits  ` `// of all numbers till N  ` `static` `int` `getSetBitsFromOneToN(``int` `N)  ` `{  ` `    ``int` `two = 2, ans = 0;  ` `    ``int` `n = N;  ` ` `  `    ``while` `(n!=0) {  ` `        ``ans += (N / two) * (two >> 1);  ` ` `  `        ``if` `((N & (two - 1)) > (two >> 1) - 1)  ` `            ``ans += (N & (two - 1)) - (two >> 1) + 1;  ` ` `  `        ``two <<= 1;  ` `        ``n >>= 1;  ` `    ``}  ` `    ``return` `ans;  ` `}  ` ` `  `// Function to find the minimum number  ` `static` `int` `findMinimum(``int` `x)  ` `{  ` `    ``int` `low = 0, high = 100000;  ` ` `  `    ``int` `ans = high;  ` ` `  `    ``// Binary search for the lowest number  ` `    ``while` `(low <= high) {  ` ` `  `        ``// Find mid number  ` `        ``int` `mid = (low + high) >> 1;  ` ` `  `        ``// Check if it is atleast x  ` `        ``if` `(getSetBitsFromOneToN(mid) >= x) {  ` `            ``ans = Math.Min(ans, mid);  ` `            ``high = mid - 1;  ` `        ``}  ` `        ``else` `            ``low = mid + 1;  ` `    ``}  ` ` `  `    ``return` `ans;  ` `}  ` ` `  `    ``// Driver Code  ` `    ``public` `static` `void` `Main()  ` `    ``{  ` `        ``int` `x = 20;  ` `        ``Console.WriteLine(findMinimum(x));  ` `     `  `    ``}  ` `    ``// This code is contributed by Ryuga ` `}  `

PHP

> 1);

if ((\$N & (\$two – 1)) > (\$two >> 1) – 1)
\$ans += (\$N & (\$two – 1)) –
(\$two >> 1) + 1;

\$two <<= 1; \$n >>= 1;
}
return \$ans;
}

// Function to find the minimum number
function findMinimum(\$x)
{
\$low = 0;
\$high = 100000;

\$ans = \$high;

// Binary search for the lowest number
while (\$low <= \$high) { // Find mid number \$mid = (\$low + \$high) >> 1;

// Check if it is atleast x
if (getSetBitsFromOneToN(\$mid) >= \$x)
{
\$ans = min(\$ans, \$mid);
\$high = \$mid – 1;
}
else
\$low = \$mid + 1;
}

return \$ans;
}

// Driver Code
\$x = 20;
echo findMinimum(\$x);

// This code is contributed
// by Sach_Code
?>

Output:

```11
```

Time Complexity: O(log N * log N)

My Personal Notes arrow_drop_up