Given a positive integer n. Find the value of
where function F(i) for number i be defined as the sum of all divisors of ‘i‘.
Examples :
Input: 4 Output: 15 Explanation F(1) = 1 F(2) = 1 + 2 = 3 F(3) = 1 + 3 = 4 F(4) = 1 + 2 + 4 = 7 ans = F(1) + F(2) + F(3) + F(4) = 1 + 3 + 4 + 7 = 15 Input: 5 Output: 21
Naive approach is to traverse for every number(1 to n), find all divisors and keep updating the sum with that divisor. See this to understand more.
C++
// C++ program to find sum of all // divisor of number up to 'n' #include<bits/stdc++.h> using namespace std; // Utility function to find sum of // all divisor of number up to 'n' int divisorSum( int n) { int sum = 0; for ( int i = 1; i <= n; ++i) { // Find all divisors of i and add them for ( int j = 1; j * j <= i; ++j) { if (i % j == 0) { if (i / j == j) sum += j; else sum += j + i / j; } } } return sum; } // Driver code int main() { int n = 4; cout << " " << divisorSum(n) << endl; n = 5; cout << " " << divisorSum(n); return 0; } |
Java
// JAVA program to find sum of all // divisor of number up to 'n' import java.io.*; class GFG { // Utility function to find sum of // all divisor of number up to 'n' static int divisorSum( int n) { int sum = 0 ; for ( int i = 1 ; i <= n; ++i) { // Find all divisors of i // and add them for ( int j = 1 ; j * j <= i; ++j) { if (i % j == 0 ) { if (i / j == j) sum += j; else sum += j + i / j; } } } return sum; } // Driver code public static void main(String args[]) { int n = 4 ; System.out.println(divisorSum(n)); n = 5 ; System.out.println(divisorSum(n)); } } /*This code is contributed by Nikita tiwari.*/ |
Python3
# Python3 code to find sum of all # divisor of number up to 'n' # Utility function to find sum of # all divisor of number up to 'n' def divisorSum( n ): sum = 0 for i in range ( 1 , n + 1 ): # Find all divisors of i # and add them j = 1 while j * j < = i: if i % j = = 0 : if i / j = = j: sum + = j else : sum + = j + i / j j = j + 1 return int ( sum ) # Driver code n = 4 print ( divisorSum(n)) n = 5 print ( divisorSum(n)) # This code is contributed by "Sharad_Bhardwaj". |
C#
// C# program to find sum of all // divisor of number up to 'n' using System; class GFG { // Utility function to find sum of // all divisor of number up to 'n' static int divisorSum( int n) { int sum = 0; for ( int i = 1; i <= n; ++i) { // Find all divisors of i // and add them for ( int j = 1; j * j <= i; ++j) { if (i % j == 0) { if (i / j == j) sum += j; else sum += j + i / j; } } } return sum; } // Driver code public static void Main() { int n = 4; Console.WriteLine(divisorSum(n)); n = 5; Console.WriteLine(divisorSum(n)); } } /*This code is contributed by vt_m.*/ |
PHP
<?php // PHP program to find sum of all // divisor of number up to 'n' // Utility function to find sum of // all divisor of number up to 'n' function divisorSum( $n ) { $sum = 0; for ( $i = 1; $i <= $n ; ++ $i ) { // Find all divisors of i // and add them for ( $j = 1; $j * $j <= $i ; ++ $j ) { if ( $i % $j == 0) { if ( $i / $j == $j ) $sum += $j ; else $sum += $j + $i / $j ; } } } return $sum ; } // Driver code $n = 4; echo "\n" , divisorSum( $n ), "\n" ; $n = 5; echo divisorSum( $n ), "\n" ; // This code is contributed by aj_36 ?> |
Output :
15 21
Time complexity: O(n√(n)))
Auxiliary space: O(1)
Efficient approach is to observe the function and co-relate the pattern. For a given number n, every number from 1 to n contributes its presence up to the highest multiple less than n. For instance,
Let n = 6, => F(1) + F(2) + F(3) + F(4) + F(5) + F(6) => 1 will occurs 6 times in F(1), F(2), F(3), F(4), F(5) and F(6) => 2 will occurs 3 times in F(2), F(4) and F(6) => 3 will occur 2 times in F(3) and F(6) => 4 will occur 1 times in F(4) => 5 will occur 1 times in F(5) => 6 will occur 1 times in F(6)
From the above observation, it can easily be observed that number i is occurring only in their multiples less than or equal to n. Thus, we just need to find the count of multiples and then multiply it with i for full contribution in the final sum. It can easily be done in O(1) time by taking the floor of (n / i) and then multiply it with i for the sum.
C++
// C++ program to find sum of all // divisor of number up to 'n' #include<bits/stdc++.h> using namespace std; // Utility function to find sum of // all divisor of number up to 'n' int divisorSum( int n) { int sum = 0; for ( int i = 1; i <= n; ++i) sum += (n / i) * i; return sum; } // Driver code int main() { int n = 4; cout << " " << divisorSum(n)<<endl; n = 5; cout << " " << divisorSum(n)<< endl; return 0; } // This code is comtributed by shivanisinghss2110 |
C
// C program to find sum of all // divisor of number up to 'n' #include <stdio.h> // Utility function to find sum of // all divisor of number up to 'n' int divisorSum( int n) { int sum = 0; for ( int i = 1; i <= n; ++i) sum += (n / i) * i; return sum; } // Driver code int main() { int n = 4; printf ( "%d\n" , divisorSum(n)); n = 5; printf ( "%d" , divisorSum(n)); return 0; } |
Java
// Java program to find sum of all // divisor of number up to 'n' import java.io.*; class GFG { // Utility function to find sum of // all divisor of number up to 'n' static int divisorSum( int n) { int sum = 0 ; for ( int i = 1 ; i <= n; ++i) sum += (n / i) * i; return sum; } // Driver code public static void main(String args[]) { int n = 4 ; System.out.println(divisorSum(n)); n = 5 ; System.out.println(divisorSum(n)); } } /*This code is contributed by Nikita Tiwari.*/ |
Python3
# Python3 code to find sum of all # divisor of number up to 'n' # Utility function to find sum of # all divisor of number up to 'n' def divisorSum( n ): sum = 0 for i in range ( 1 , n + 1 ): sum + = int (n / i) * i return int ( sum ) # Driver code n = 4 print ( divisorSum(n)) n = 5 print ( divisorSum(n)) # This code is contributed by "Sharad_Bhardwaj". |
C#
// C# program to find sum of all // divisor of number up to 'n' using System; class GFG { // Utility function to find sum of // all divisor of number up to 'n' static int divisorSum( int n) { int sum = 0; for ( int i = 1; i <= n; ++i) sum += (n / i) * i; return sum; } // Driver code public static void Main() { int n = 4; Console.WriteLine(divisorSum(n)); n = 5; Console.WriteLine(divisorSum(n)); } } /*This code is contributed by vt_m.*/ |
PHP
<?php // PHP program to find sum of all // divisor of number up to 'n' // Utility function to find sum of // all divisor of number up to 'n' function divisorSum( $n ) { $sum = 0; for ( $i = 1; $i <= $n ; ++ $i ) $sum += floor ( $n / $i ) * $i ; return $sum ; } // Driver code $n = 4; echo divisorSum( $n ), "\n" ; $n = 5; echo divisorSum( $n ), "\n" ; // This code is contributed by anuj_67. ?> |
Output :
15 21
Time complexity: O(n)
Auxiliary space: O(1)
More efficient solution:
We need to calculate
To evaluate the above expression in O(sqrt(N)) we make use of The Harmonic Lemma.
Consider the harmonic sequence on integer division: {N/1, N/2, N/3, ….. ,N/N}
The lemma states that the above sequence is non-increasing, and there are at most 2*sqrt(N) different elements.
Consider floor(N/i) = k. Thus, k <= N/i < k+1. From this we get largest = floor(N/k). Therefore, we can find a range of values of i for which floor(N/i) is constant. And using The Harmonic Lemma we know that will be at most 2*sqrt(N) terms, thus we can calculate it programmatically in O(sqrt(N)) complexity. Consider the following example for better clarification.
C++
// C++ program to calculate sum of divisors // of numbers from 1 to N in O(sqrt(N)) complexity #include <iostream> using namespace std; #define ll long long #define mod 1000000007 /* Function to calculate x^y using Modular exponentiation Refer to https://www.geeksforgeeks.org/ modular-exponentiation-power-in-modular-arithmetic/ */ ll power(ll x, ll y, ll p) { // re x^y if p not specified // else (x^y)%p ll res = 1; x = x % p; while (y > 0) { if (y & 1) res = (res * x) % p; y = y >> 1; x = (x * x) % p; } return (res + p) % p; } // Function to find modular // inverse of a under modulo m // Assumption: m is prime ll modinv(ll x) { return power(x, mod - 2, mod); } // Function to calculate sum from 1 to n ll sum(ll n) { // sum 1 to n = (n*(n+1))/2 ll retval = ((((n % mod) * ((n + 1) % mod)) % mod) * modinv(2)) % mod; return retval; } ll divisorSum(ll n) { ll l = 1; ll ans = 0; while (l <= n) { ll k = n / l; ll r = n / k; k %= mod; // For i=l to i=r, floor(n/i) will be k ans += ((sum(r) - sum(l - 1) % mod) * k) % mod; // Since values can be very large // we need to take mod at every step ans %= mod; l = r + 1; } ans = ans % mod; return ans; } /* Driver program to test above function */ int main() { int n = 5; cout << "The sum of divisors of all numbers from 1 to " << n << " is: " << divisorSum(n) << '\n' ; n = 14; cout << "The sum of divisors of all numbers from 1 to " << n << " is: " << divisorSum(n) << '\n' ; } |
Java
// Java program to calculate // sum of divisors of numbers // from 1 to N in O(sqrt(N)) // complexity import java.util.*; class Main{ static int mod = 1000000007 ; /* Function to calculate x^y using Modular exponentiation Refer to https://www.geeksforgeeks.org/ modular-exponentiation-power-in- modular-arithmetic/ */ public static long power( long x, long y, long p) { // re x^y if p not specified // else (x^y)%p long res = 1 ; x = x % p; while (y > 0 ) { if ((y & 1 ) != 0 ) res = (res * x) % p; y = y >> 1 ; x = (x * x) % p; } return (res + p) % p; } // Function to find modular // inverse of a under modulo m // Assumption: m is prime public static long modinv( long x) { return power(x, mod - 2 , mod); } // Function to calculate sum // from 1 to n public static long sum( long n) { // sum 1 to n = (n*(n+1))/2 long retval = ((((n % mod) * ((n + 1 ) % mod)) % mod) * modinv( 2 )) % mod; return retval; } public static long divisorSum( long n) { long l = 1 ; long ans = 0 ; while (l <= n) { long k = n / l; long r = n / k; k %= mod; // For i=l to i=r, // floor(n/i) will be k ans += ((sum(r) - sum(l - 1 ) % mod) * k) % mod; // Since values can be very // large we need to take mod // at every step ans %= mod; l = r + 1 ; } ans = ans % mod; return ans; } // Driver code public static void main(String[] args) { int n = 5 ; System.out.println( "The sum of divisors of" + " all numbers from 1 to " + n + " is: " + divisorSum(n)); n = 14 ; System.out.println( "The sum of divisors of all" + " numbers from 1 to " + n + " is: " + divisorSum(n)); } } // This code is contributed by divyeshrabadiya07 |
Python3
# Python program to calculate # sum of divisors of numbers # from 1 to N in O(sqrt(N)) # complexity mod = 1000000007 ; # Function to calculate x^y using Modular exponentiation Refer to # https:#www.geeksforgeeks.org/ modular-exponentiation-power-in- # modular-arithmetic/ def power(x, y, p): # re x^y if p not specified # else (x^y)%p res = 1 ; x = x % p; while (y > 0 ): if ((y & 1 ) ! = 0 ): res = (res * x) % p; y = y >> 1 ; x = (x * x) % p; return (res + p) % p; # Function to find modular # inverse of a under modulo m # Assumption: m is prime def modinv(x): return power(x, mod - 2 , mod); # Function to calculate sum # from 1 to n def sum (n): # sum 1 to n = (n*(n+1))/2 retval = ((((n % mod) * ((n + 1 ) % mod)) % mod) * modinv( 2 )) % mod; return retval; def divisorSum(n): l = 1 ; ans = 0 ; while (l < = n): k = n / / l; r = n / / k; k % = mod; # For i=l to i=r, # floor(n/i) will be k ans + = (( sum (r) - sum (l - 1 ) % mod) * k) % mod; # Since values can be very # large we need to take mod # at every step ans % = mod; l = r + 1 ; ans = ans % mod; return ans; # Driver code if __name__ = = '__main__' : n = 5 ; print ( "The sum of divisors of all numbers from 1 to " , n , " is: " , int ( divisorSum(n))); n = 14 ; print ( "The sum of divisors of all numbers from 1 to " , n , " is: " , int (divisorSum(n))); # This code contributed by aashish1995 Write |
C#
// C# program to calculate // sum of divisors of numbers // from 1 to N in O(sqrt(N)) // complexity using System; class GFG{ static int mod = 1000000007; /* Function to calculate x^y using Modular exponentiation Refer to https://www.geeksforgeeks.org/ modular-exponentiation-power-in- modular-arithmetic/ */ static long power( long x, long y, long p) { // re x^y if p not specified // else (x^y)%p long res = 1; x = x % p; while (y > 0) { if ((y & 1) != 0) res = (res * x) % p; y = y >> 1; x = (x * x) % p; } return (res + p) % p; } // Function to find modular // inverse of a under modulo m // Assumption: m is prime static long modinv( long x) { return power(x, mod - 2, mod); } // Function to calculate sum // from 1 to n static long sum( long n) { // sum 1 to n = (n*(n+1))/2 long retval = ((((n % mod) * ((n + 1) % mod)) % mod) * modinv(2)) % mod; return retval; } static long divisorSum( long n) { long l = 1; long ans = 0; while (l <= n) { long k = n / l; long r = n / k; k %= mod; // For i=l to i=r, // floor(n/i) will be k ans += ((sum(r) - sum(l - 1) % mod) * k) % mod; // Since values can be very // large we need to take mod // at every step ans %= mod; l = r + 1; } ans = ans % mod; return ans; } // Driver code static void Main() { int n = 5; Console.WriteLine( "The sum of divisors of" + " all numbers from 1 to " + n + " is: " + divisorSum(n)); n = 14; Console.WriteLine( "The sum of divisors of all" + " numbers from 1 to " + n + " is: " + divisorSum(n)); } } // This code is contributed by divyesh072019 |
Output:
The sum of divisors of all numbers from 1 to 5 is: 21 The sum of divisors of all numbers from 1 to 14 is: 165
Time complexity: O(sqrt(N))
Auxiliary space: O(1)
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.