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 below 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 <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; } |
C
// C implementation of the above approach #include <stdio.h> #include<math.h> // 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; printf ( "%d" ,maxSum(n)); return 0; } // This code is contributed by allwink45. |
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
<?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. ?> |
Javascript
<script> // javascript implementation of the above approach // Function to find the smallest divisor function smallestDivisor(n) { var mx = Math.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) { var res = n; while (n > 1) { var divi = smallestDivisor(n); n /= divi; res += n; } return res; } // Driver Code var n = 34; document.write(maxSum(n)); // This code is contributed by Rajput-Ji </script> |
Output:
52
Time Complexity: O(sqrt(n)*log(n)), where n represents the given integer.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Please Login to comment...