Related Articles
Maximum sum after repeatedly dividing N by a divisor
• Last Updated : 23 Apr, 2021

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

 `// C++ implementation of the above approach``#include ``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;``}`

## Java

 `// 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.`

## Python3

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

## C#

 `// 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.`

## PHP

 ` 1)``    ``{``        ``\$divi` `= smallestDivisor(``\$n``);``        ``\$n` `/= ``\$divi``;``        ``\$res` `+= ``\$n``;``    ``}``    ``return` `\$res``;``}` `    ``// Driver Code``    ``\$n` `= 34;``    ``echo` `maxSum(``\$n``);` `#This code is contributed by akt_mit.``?>`

## Javascript

 ``
Output:
`52`

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live and Geeks Classes Live USA

My Personal Notes arrow_drop_up