Maximum sum after repeatedly dividing N by a divisor

Given an integer N. The task is to find the maximum possible sum of intermediate values (Including N and 1) attained after applying the beow operation:

Divide N by any divisor (>1) until it becomes 1.

Examples:

Input: N = 10
Output: 16
Initially, N=10
1st Division -> N = 10/2 = 5 
2nd Division -> N= 5/5 = 1

Input: N = 8
Output: 15
Initially, N=8
1st Division -> N = 8/2 = 4 
2nd Division -> N= 4/2 = 2
3rd Division -> N= 2/2 = 1

Approach: Since the task is to maximize the sum of values after each step, try to maximize individual values. So, reduce the value of N by as little as possible. To achieve that, we divide N by its smallest divisor.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the smallest divisor
int smallestDivisor(int n)
{
    int mx = sqrt(n);
    for (int i = 2; i <= mx; i++)
        if (n % i == 0)
            return i;
    return n;
}
  
// Function to find the maximum sum
int maxSum(int n)
{
    long long res = n;
    while (n > 1) {
        int divi = smallestDivisor(n);
        n /= divi;
        res += n;
    }
    return res;
}
  
// Driver Code
int main()
{
    int n = 34;
    cout << maxSum(n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the above approach
import java.io.*;
  
class GFG 
{
      
// Function to find the smallest divisor
static double smallestDivisor(int n)
{
    double mx = Math.sqrt(n);
    for (int i = 2; i <= mx; i++)
        if (n % i == 0)
            return i;
    return n;
}
  
// Function to find the maximum sum
static double maxSum(int n)
{
    long res = n;
    while (n > 1
    {
        double divi = smallestDivisor(n);
        n /= divi;
        res += n;
    }
    return res;
}
  
    // Driver Code
    public static void main (String[] args) 
    {
        int n = 34;
        System.out.println (maxSum(n));
    }
}
  
// This code is contributed by jit_t.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

from math import sqrt
# Python 3 implementation of the above approach
  
# Function to find the smallest divisor
def smallestDivisor(n):
    mx = int(sqrt(n))
    for i in range(2, mx + 1, 1):
        if (n % i == 0):
            return i
    return n
  
# Function to find the maximum sum
def maxSum(n):
    res = n
    while (n > 1):
        divi = smallestDivisor(n)
        n = int(n/divi)
        res += n
      
    return res
  
# Driver Code
if __name__ == '__main__':
    n = 34
    print(maxSum(n))
  
# This code is contributed by
# Surendra_Gangwar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the above approach 
using System;
  
class GFG 
      
    // Function to find the smallest divisor 
    static double smallestDivisor(int n) 
    
        double mx = Math.Sqrt(n); 
        for (int i = 2; i <= mx; i++) 
            if (n % i == 0) 
                return i; 
        return n; 
    
      
    // Function to find the maximum sum 
    static double maxSum(int n) 
    
        long res = n; 
        while (n > 1) 
        
            double divi = smallestDivisor(n); 
            n /= (int)divi; 
            res += n; 
        
        return res; 
    
      
    // Driver Code 
    public static void Main() 
    
        int n = 34; 
        Console.WriteLine(maxSum(n)); 
    
  
// This code is contributed by Ryuga. 

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
  
// PHP implementation of the above approach
// Function to find the smallest divisor
function smallestDivisor($n)
{
    $mx = sqrt($n);
    for ($i = 2; $i <= $mx; $i++)
        if ($n % $i == 0)
            return $i;
    return $n;
}
  
// Function to find the maximum sum
function maxSum($n)
{
    $res = $n;
    while ($n > 1)
    {
        $divi = smallestDivisor($n);
        $n /= $divi;
        $res += $n;
    }
    return $res;
}
  
    // Driver Code
    $n = 34;
    echo maxSum($n);
  
#This code is contributed by akt_mit.
?>

chevron_right


Output:

52

Time Complexity: O(sqrt(n)*log(n))



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.