Same Number Of Set Bits As N

Given a positive integer N, find out how many positive integers strictly less than N have the same number of set bits as N.

Examples:

```Input : 8
Output :3
Explanation: Binary representation of
8 : 1000, so number of set bits in 8 is 1.
So the integers less than 8 with same number
of set bits are : 4, 2, 1

Input :1
Output :0

Input :4
Output :2 ```

Approach1:

```1. Using __builtin_popcount() inbuilt function, count set bits in N and store into a
temp variable
2. Iterate from n-1 to 1 and also count set bits in i using __builtin_popcount()
function
3. Now, compare temp with __builtin_popcount(i)
4. If both are equal then increment counter variable
5. Return counter```

Below is the implementation of the above approach.

C++

 `// CPP program to find numbers less than N` `// that have same Number Of Set Bits As N` `#include ` `using` `namespace` `std;`   `int` `smallerNumsWithSameSetBits(``int` `n)` `{        ` `    ``// __builtin_popcount function that count` `    ``// set bits in n` `    ``int` `temp = __builtin_popcount(n);` `    `  `    ``// Iterate from n-1 to 1` `    ``int` `count = 0;` `    ``for` `(``int` `i = n - 1; i > 0; i--) {` `        `  `        ``// check if the number of set bits ` `        ``// equals to temp increment count        ` `        ``if` `(temp == __builtin_popcount(i))` `            ``count++;` `    ``}` `    ``return` `count;` `}`   `// Driver Code ` `int` `main()` `{` `    ``int` `n = 4;` `    ``cout << smallerNumsWithSameSetBits(n);` `    ``return` `0;` `}`

Java

 `// Java program to find numbers less than N` `// that have same Number Of Set Bits As N` `class` `GFG {` `    `  `    ``// returns number of set bits in a number` `    ``static` `int` `__builtin_popcount(``int` `n)` `    ``{` `        ``int` `d, t = ``0``;` `        `  `        ``while``(n > ``0``)` `        ``{` `            ``d = n % ``2``;` `            ``n = n / ``2``;` `            ``if``(d == ``1``)` `                ``t++;` `        ``}` `        ``return` `t;` `    ``}` `    `  `    ``static` `int` `smallerNumsWithSameSetBits(``int` `n)` `    ``{     ` `        ``// __builtin_popcount function that count` `        ``// set bits in n` `        ``int` `temp = __builtin_popcount(n);` `        `  `        ``// Iterate from n-1 to 1` `        ``int` `count = ``0``;` `        ``for` `(``int` `i = n - ``1``; i > ``0``; i--) {` `            `  `            ``// check if the number of set bits ` `            ``// equals to temp increment count     ` `            ``if` `(temp == __builtin_popcount(i))` `                ``count++;` `        ``}` `        ``return` `count;` `    ``}` `    `  `    ``// Driver Code ` `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``int` `n = ``4``;` `        ``System.out.println(` `            ``smallerNumsWithSameSetBits(n));` `    ``}` `}`   `// This code is contributed by Arnab Kundu.`

Python3

 `# Python3 program to find numbers ` `# less than N that have same` `# Number Of Set Bits As N` `def` `__builtin_popcount(n) :` `    ``t ``=` `0`    `    ``while``(n > ``0``) :` `        ``d ``=` `n ``%` `2` `        ``n ``=` `int``(n ``/` `2``)` `        ``if``(d ``=``=` `1``) :` `            ``t ``=` `t ``+` `1` `    ``return` `t`   `def` `smallerNumsWithSameSetBits(n) :    ` `    `  `    ``# __builtin_popcount function ` `    ``# that count set bits in n` `    ``temp ``=` `__builtin_popcount(n)` `    `  `    ``# Iterate from n-1 to 1` `    ``count ``=` `0` `    ``for` `i ``in` `range``(n``-``1``,``0``,``-``1``) :     ` `        `  `        ``# check if the number of ` `        ``# set bits equals to temp` `        ``# increment count     ` `        ``if` `(temp ``=``=` `__builtin_popcount(i)) :` `            ``count ``=` `count ``+` `1` `    ``return` `count`   `# Driver Code ` `n ``=` `4` `print` `(smallerNumsWithSameSetBits(n))`   `# This code is contributed by ` `# Manish Shaw(manishshaw1)`

C#

 `// C# program to find numbers less than N` `// that have same Number Of Set Bits As N` `using` `System;`   `class` `GFG {` `    `  `    ``// returns number of set bits in a number` `    ``static` `int` `__builtin_popcount(``int` `n)` `    ``{` `        ``int` `d, t = 0;` `         `  `        ``while``(n > 0)` `        ``{` `            ``d = n % 2;` `            ``n = n / 2;` `            ``if``(d == 1)` `                ``t++;` `        ``}` `        ``return` `t;` `    ``}` `    `  `    ``static` `int` `smallerNumsWithSameSetBits(``int` `n)` `    ``{     ` `        ``// __builtin_popcount function that count` `        ``// set bits in n` `        ``int` `temp = __builtin_popcount(n);` `        `  `        ``// Iterate from n-1 to 1` `        ``int` `count = 0;` `        ``for` `(``int` `i = n - 1; i > 0; i--) {` `            `  `            ``// check if the number of set bits ` `            ``// equals to temp increment count     ` `            ``if` `(temp == __builtin_popcount(i))` `                ``count++;` `        ``}` `        ``return` `count;` `    ``}` `    `  `    ``// Driver Code ` `    ``static` `public` `void` `Main(String []args)` `    ``{` `        ``int` `n = 4;` `        ``Console.WriteLine(` `            ``smallerNumsWithSameSetBits(n));` `    ``}` `}`   `// This code is contributed by Arnab Kundu.`

PHP

 ` 0)` `    ``{` `        ``\$d` `= ``\$n` `% 2;` `        ``\$n` `= ``intval``(``\$n` `/ 2);` `        ``if``(``\$d` `== 1)` `            ``\$t``++;` `    ``}` `    ``return` `\$t``;` `}` `function` `smallerNumsWithSameSetBits(``\$n``)` `{     ` `    ``// __builtin_popcount function ` `    ``// that count set bits in n` `    ``\$temp` `= __builtin_popcount(``\$n``);` `    `  `    ``// Iterate from n-1 to 1` `    ``\$count` `= 0;` `    ``for` `(``\$i` `= ``\$n` `- 1; ``\$i` `> 0; ``\$i``--)` `    ``{` `        `  `        ``// check if the number of ` `        ``// set bits equals to temp` `        ``// increment count     ` `        ``if` `(``\$temp` `== __builtin_popcount(``\$i``))` `            ``\$count``++;` `    ``}` `    ``return` `\$count``;` `}`   `// Driver Code ` `\$n` `= 4;` `echo` `(smallerNumsWithSameSetBits(``\$n``));`   `// This code is contributed by ` `// Manish Shaw(manishshaw1)` `?>`

Javascript

 ``

Output:

`2`

Time Complexity: O(N log N), where N is the input number

Space Complexity: O(1)

Approach 2: This problem can be solved using Bit Manipulation and Pascal Triangle.

• First precompute all the required nCr where n is the log(N) or length of binary representation of N.
• Now start iterating from right side of binary representaion of N.
• when the bit is set then calculate numbers less than it by calculating number of ways to arrange set bits till this place in the length of binary representation so far that is equal to nCr.
• Keep adding this for every set bit encountered.

Below is the implementation of the above approach:

C++

 `#include ` `using` `namespace` `std;`   `long` `long` `dp[41][41];` `int` `pre = 0;`   `long` `long` `ncr(``int` `n, ``int` `r)` `{` `    ``if` `(!pre) {` `        ``// Using Pascal's triangle to precompute all` `        ``// possible nCr` `        ``pre = 1;` `        ``dp[0][0] = 0;` `        ``dp[1][0] = 1;` `        ``dp[1][1] = 1;`   `        ``for` `(``int` `i = 2; i <= 40; i++) {` `            ``dp[i][0] = 1;` `            ``for` `(``int` `j = 1; j < i; j++) {` `                ``dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];` `            ``}` `            ``dp[i][i] = 1;` `        ``}` `    ``}` `    ``return` `dp[n][r];` `}`   `long` `long` `count(``long` `long` `x)` `{` `    ``long` `long` `ans = 0;` `    ``long` `long` `cnt = 0;` `    ``long` `long` `len = 0;` `    ``while` `(x > 0) {` `        ``if` `(x & 1) {` `            ``cnt++;` `            ``ans += ncr(len, cnt);` `        ``}` `        ``len++;` `        ``x >>= 1;` `    ``}` `    ``return` `ans;` `}`   `int` `main()` `{`   `    ``int` `N = 4;` `    ``cout << count(N) << endl;` `    ``return` `0;` `}`

Java

 `public` `class` `Main {`   `  ``static` `long``[][] dp = ``new` `long``[``41``][``41``];` `  ``static` `int` `pre = ``0``;`   `  ``static` `long` `ncr(``long` `n, ``long` `r) {` `    ``if` `(pre == ``0``)` `    ``{` `      `  `      ``// Using Pascal's triangle to precompute all` `      ``// possible nCr` `      ``pre = ``1``;` `      ``dp[``0``][``0``] = ``0``;` `      ``dp[``1``][``0``] = ``1``;` `      ``dp[``1``][``1``] = ``1``;`   `      ``for` `(``int` `i = ``2``; i <= ``40``; i++) {` `        ``dp[i][``0``] = ``1``;` `        ``for` `(``int` `j = ``1``; j < i; j++) {` `          ``dp[i][j] = dp[i - ``1``][j] + dp[i - ``1``][j - ``1``];` `        ``}` `        ``dp[i][i] = ``1``;` `      ``}` `    ``}` `    ``return` `dp[(``int``)n][(``int``)r];` `  ``}`   `  ``static` `long` `count(``long` `x) {` `    ``long` `ans = ``0``;` `    ``long` `cnt = ``0``;` `    ``long` `len = ``0``;` `    ``while` `(x > ``0``) {` `      ``if` `((x & ``1``) == ``1``) {` `        ``cnt++;` `        ``ans += ncr(len, cnt);` `      ``}` `      ``len++;` `      ``x >>= ``1``;` `    ``}` `    ``return` `ans;` `  ``}`   `  ``public` `static` `void` `main(String[] args) {` `    ``int` `N = ``4``;` `    ``System.out.println(count(N));` `  ``}` `}`   `// This code is contributed by ishankhandelwals.`

Python3

 `dp ``=` `[[``0` `for` `i ``in` `range``(``41``)] ``for` `j ``in` `range``(``41``)]` `pre ``=` `0`   `def` `ncr(n, r):` `    ``global` `pre` `    ``if` `pre ``=``=` `0``:` `        ``pre ``=` `1` `        ``dp[``0``][``0``] ``=` `0` `        ``dp[``1``][``0``] ``=` `1` `        ``dp[``1``][``1``] ``=` `1`   `        ``for` `i ``in` `range``(``2``, ``41``):` `            ``dp[i][``0``] ``=` `1` `            ``for` `j ``in` `range``(``1``, i):` `                ``dp[i][j] ``=` `dp[i``-``1``][j] ``+` `dp[i``-``1``][j``-``1``]` `            ``dp[i][i] ``=` `1` `    ``return` `dp[n][r]`   `def` `count(x):` `    ``ans ``=` `0` `    ``cnt ``=` `0` `    ``len` `=` `0` `    ``while` `x > ``0``:` `        ``if` `x & ``1``:` `            ``cnt ``+``=` `1` `            ``ans ``+``=` `ncr(``len``, cnt)` `        ``len` `+``=` `1` `        ``x >>``=` `1` `    ``return` `ans`   `N ``=` `4` `print``(count(N))`   `# This code is contributed by ishankhandelwals.`

C#

 `using` `System;`   `class` `GFG {` `  ``static` `int` `ncr(``int` `n, ``int` `r)` `  ``{` `    ``int``[, ] dp = ``new` `int``[41, 41];` `    ``int` `pre = 0;` `    ``if` `(pre == 0)` `    ``{`   `      ``// Using Pascal's triangle to precompute all` `      ``// possible nCr` `      ``pre = 1;` `      ``dp[0, 0] = 0;` `      ``dp[1, 0] = 1;` `      ``dp[1, 1] = 1;`   `      ``for` `(``int` `i = 2; i <= 40; i++) {` `        ``dp[i, 0] = 1;` `        ``for` `(``int` `j = 1; j < i; j++) {` `          ``dp[i, j]` `            ``= dp[i - 1, j] + dp[i - 1, j - 1];` `        ``}` `        ``dp[i, i] = 1;` `      ``}` `    ``}` `    ``return` `dp[n, r];` `  ``}`   `  ``static` `int` `count(``int` `x)` `  ``{` `    ``int` `ans = 0;` `    ``int` `cnt = 0;` `    ``int` `len = 0;` `    ``while` `(x > 0) {` `      ``if` `((x & 1) != 0) {` `        ``cnt++;` `        ``ans += ncr(len, cnt);` `      ``}` `      ``len++;` `      ``x >>= 1;` `    ``}` `    ``return` `ans;` `  ``}` `  ``static` `void` `Main()` `  ``{` `    ``int` `N = 4;` `    ``Console.Write(count(N));` `  ``}` `}`   `// This code is contributed by garg28harsh.`

Javascript

 `let dp= ``new` `Array(41);` `let pre = 0;`   `function` `ncr(n, r)` `{` `    ``if` `(pre == 0)` `    ``{` `    `  `        ``// Using Pascal's triangle to precompute all` `        ``// possible nCr` `        ``pre = 1;` `        ``dp[0][0] = 0;` `        ``dp[1][0] = 1;` `        ``dp[1][1] = 1;`   `        ``for` `(let i = 2; i <= 40; i++) {` `            ``dp[i][0] = 1;` `            ``for` `(let j = 1; j < i; j++) {` `                ``dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];` `            ``}` `            ``dp[i][i] = 1;` `        ``}` `    ``}` `    ``return` `dp[n][r];` `}`   `function` `count( x)` `{` `    ``let ans = 0;` `    ``let cnt = 0;` `    ``let len = 0;` `    ``for``(let i=0;i<41;i++)` `        ``dp[i] = ``new` `Array(41);` `    ``while` `(x > 0) {` `        ``if` `(x & 1) {` `            ``cnt++;` `            ``ans += ncr(len, cnt);` `        ``}` `        ``len++;` `        ``x >>= 1;` `    ``}` `    ``return` `ans;` `}` `   `  `    ``let N = 4;` `    ``console.log(count(N));` `   `  `   ``// This code is contributed by garg28harsh.`

Output

`2`

Time Complexity: O(log N)

Space Complexity: O(N^2).

Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!

Previous
Next