Sum of bit differences for numbers from 0 to N | Set 2
Given a number N, the task is to calculate the total number of corresponding different bit in the binary representation for every consecutive number from 0 to N.
Examples:
Input: N = 5
Output: 8
Explanation:
Binary Representation of numbers are:
0 -> 000,
1 -> 001,
2 -> 010,
3 -> 011,
4 -> 100,
5 -> 101
Between 1 and 0 -> 1 bit is different
Between 2 and 1 -> 2 bits are different
Between 3 and 2 -> 1 bit is different
Between 4 and 3 -> 3 bits are different
Between 5 and 4 -> 1 bit is different
Total = 1 + 2 + 1 + 3 + 1 = 8
Input: N = 11
Output: 19
For Naive and Efficient Approach please refer to the previous post of this article.
More Efficient Approach: To optimize the above methods, we can use Recursion. To solve the problem, the following observations need to be made
Number: 0 1 2 3 4 5 6 7
Difference: 1 2 1 3 1 2 1 4
Sum: 1 3 4 7 8 10 11 15
We can observe that for N = [1, 2, 3, 4, …..], the sum of different bits in consecutive elements forms the sequence [1, 3, 4, 7, 8, ……]. Hence, Nth term of this series will be our required answer, which can be calculated as:
a(n) = a(n / 2) + n; with base case as a(1) = 1
Below is the implementation for above Recursive approach:
C++
#include <bits/stdc++.h>
using namespace std;
int totalCountDifference( int n)
{
if (n == 1)
return 1;
return n
+ totalCountDifference(n / 2);
}
int main()
{
int N = 5;
cout << totalCountDifference(N);
return 0;
}
|
Java
class GFG{
static int totalCountDifference( int n)
{
if (n == 1 )
return 1 ;
return n + totalCountDifference(n / 2 );
}
public static void main(String[] args)
{
int N = 5 ;
System.out.println(totalCountDifference(N));
}
}
|
Python3
def totalCountDifference (n):
if (n = = 1 ):
return 1
return n + totalCountDifference(n / / 2 )
N = 5
print (totalCountDifference(N))
|
C#
using System;
class GFG{
static int totalCountDifference( int n)
{
if (n == 1)
return 1;
return n + totalCountDifference(n / 2);
}
public static void Main()
{
int N = 5;
Console.WriteLine(totalCountDifference(N));
}
}
|
Javascript
<script>
function totalCountDifference(n)
{
if (n == 1)
return 1;
return n + totalCountDifference(Math.floor(n / 2));
}
let N = 5;
document.write(totalCountDifference(N));
</script>
|
Time Complexity: O(log2N)
Auxiliary Space: O(1)
Most Efficient Approach: Dynamic Programming (Using Memoization)
The above recursive approach can give MLE (Memory Limit Exceeded) for larger inputs due to recursive calls which will use stack spaces.
C++
#include <bits/stdc++.h>
using namespace std;
static int dp[101];
int totalCountDifference( int n)
{
if (n == 1)
return 1;
if (dp[n] != -1)
return dp[n];
dp[n] = n + totalCountDifference(n / 2);
return dp[n];
}
int main()
{
int N = 5;
memset (dp, -1, sizeof (dp));
cout << totalCountDifference(N);
return 0;
}
|
Java
import java.util.*;
public class GFG
{
static int []dp = new int [ 101 ];
static int totalCountDifference( int n)
{
if (n == 1 )
return 1 ;
if (dp[n] != - 1 )
return dp[n];
dp[n] = n + totalCountDifference(n / 2 );
return dp[n];
}
public static void main(String args[])
{
int N = 5 ;
for ( int i = 0 ; i < 101 ; i++) {
dp[i] = - 1 ;
}
System.out.print(totalCountDifference(N));
}
}
|
Python
dp = [ - 1 ] * 101
def totalCountDifference(n):
if (n = = 1 ):
return 1
if (dp[n] ! = - 1 ):
return dp[n]
dp[n] = n + totalCountDifference(n / / 2 )
return dp[n]
N = 5
print (totalCountDifference(N))
|
C#
using System;
class GFG
{
static int []dp = new int [101];
static int totalCountDifference( int n)
{
if (n == 1)
return 1;
if (dp[n] != -1)
return dp[n];
dp[n] = n + totalCountDifference(n / 2);
return dp[n];
}
public static void Main()
{
int N = 5;
for ( int i = 0; i < 101; i++) {
dp[i] = -1;
}
Console.Write(totalCountDifference(N));
}
}
|
Javascript
<script>
let dp = new Array(1001);
dp.fill(-1);
function totalCountDifference(n) {
if (n == 1) {
return 1;
}
if (dp[n] != -1) {
return dp[n];
}
dp[n] = n + totalCountDifference(Math.floor(n / 2));
return dp[n];
}
let N = 5
document.write(totalCountDifference(N))
</script>
|
Time Complexity: O(log2N)
Auxiliary Space: O(N)
Last Updated :
08 Mar, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...