Value of continuous floor function : F(x) = F(floor(x/2)) + x

Given an array of positive integers. For every element x of array, we need to find the value of continuous floor function defined as F(x) = F(floor(x/2)) + x, where F(0) = 0.

Examples :-

Input : arr[] = {6, 8}
Output : 10 15

Explanation : F(6) = 6 + F(3)
                   = 6 + 3 + F(1)
                   = 6 + 3 + 1 + F(0)
                   = 10
Similarly F(8) = 15


Basic Approach : For given value of x, we can calculate F(x) by using simple recursive function as:

int func(int x)
{
    if (x == 0) 
        return 0;
    return (x + func(floor(x/2)));
}

In this approach if we have n queries then it will take O(x) for every query element

An Efficient Approach is to use memoization We construct an array which holds the value of F(x) for each possible value of x. We compute the value if not already computed. Else we return the value.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for finding value 
// of continuous floor function
#include <bits/stdc++.h>
  
#define max 10000
using namespace std;
  
int dp[max];
  
void initDP()
    {
         for (int i = 0; i < max; i++)
             dp[i] = -1;
    }
  
// function to return value of F(n)
int func(int x)
    {
        if (x == 0)
            return 0;
        if (dp[x] == -1)
            dp[x] = x + func(x / 2);
  
        return dp[x];
    }
  
void printFloor(int arr[], int n)
    {
        for (int i = 0; i < n; i++)
            cout << func(arr[i]) << " ";
    }
  
// Driver code
int main()
    {
        // call the initDP() to fill DP array
        initDP();
  
        int arr[] = { 8, 6 };
        int n = sizeof(arr) / sizeof(arr[0]);
  
        printFloor(arr, n);
  
        return 0;
    }

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for finding value
// of continuous floor function
class GFG 
{
    static final int max = 10000;
    static int dp[] = new int[max];
      
    static void initDP() 
    {
        for (int i = 0; i < max; i++)
            dp[i] = -1;
    }
      
    // function to return value of F(n)
    static int func(int x) 
    {
        if (x == 0)
            return 0;
        if (dp[x] == -1)
            dp[x] = x + func(x / 2);
      
        return dp[x];
    }
      
    static void printFloor(int arr[], int n) 
    {
        for (int i = 0; i < n; i++)
            System.out.print(func(arr[i]) + " ");
    }
      
    // Driver code
    public static void main(String[] args) 
    {
          
        // call the initDP() to fill DP array
        initDP();
      
        int arr[] = {8, 6};
        int n = arr.length;
      
        printFloor(arr, n);
    }
}
  
// This code is contributed by Anant Agarwal.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for finding value 
# of continuous floor function 
  
max = 10000
  
dp = [0] * max
  
# function to initialize the DP array
def initDP() :
      
        for i in range(max) : 
                dp[i] = -1
      
# function to return value of F(n) 
def func(x) :
  
    if (x == 0) :
        return 0
          
    if (dp[x] == -1) :
        dp[x] = x + func(x // 2)
  
    return dp[x] 
      
def printFloor(arr, n) :
      
    for i in range(n) :
                  
        print(func(arr[i]), end = " ")
  
# Driver Code
if __name__ == "__main__" :
  
        # call the initDP() to 
        # fill DP array      
        initDP()
  
        arr = [8, 6]
        n = len(arr)
  
        printFloor(arr, n)
  
# This code is contributed by Ryuga

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for finding value 
// of continuous floor function
using System;
  
class GFG 
{
    static int max = 10000;
    static int []dp = new int[max];
      
    static void initDP() 
    {
        for (int i = 0; i < max; i++)
            dp[i] = -1;
    }
      
    // function to return value of F(n)
    static int func(int x) 
    {
        if (x == 0)
            return 0;
        if (dp[x] == -1)
            dp[x] = x + func(x / 2);
      
        return dp[x];
    }
      
    static void printFloor(int []arr, int n) 
    {
        for (int i = 0; i < n; i++)
            Console.Write(func(arr[i]) + " ");
    }
      
    // Driver code
    public static void Main() 
    {
          
        // call the initDP() to fill DP array
        initDP();
      
        int []arr = {8, 6};
        int n = arr.Length;
      
        printFloor(arr, n);
    }
}
  
// This code is contributed by nitin mittal

chevron_right



Output:

15 10

This article is contributed by Shivam Pradhan (anuj_charm). If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : nitin mittal



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.