Open In App

Same Number Of Set Bits As N

Improve
Improve
Like Article
Like
Save
Share
Report

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 <iostream>
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




<?php
// PHP program to find numbers
// less than N that have same
// Number Of Set Bits As N
function __builtin_popcount($n)
{
    $t = 0;    
    while($n > 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




<script>
 
// Javascript program to find numbers less than N
// that have same Number Of Set Bits As N
 
// returns number of set bits in a number
function __builtin_popcount(n)
{
    var d, t = 0;
     
    while(n > 0)
    {
        d = n % 2;
        n = parseInt(n / 2);
        if(d == 1)
            t++;
    }
    return t;
}
 
function smallerNumsWithSameSetBits(n)
{       
    // __builtin_popcount function that count
    // set bits in n
    var temp = __builtin_popcount(n);
     
    // Iterate from n-1 to 1
    var count = 0;
    for (var 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
var n = 4;
document.write( smallerNumsWithSameSetBits(n));
 
 
</script>


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 <bits/stdc++.h>
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).



Last Updated : 20 Feb, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads