Related Articles
Sum of all divisors from 1 to n
• Difficulty Level : Medium
• Last Updated : 05 Jan, 2021

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

 

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

## C

 // C program to find sum of all // divisor of number up to 'n' #include    // 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

 

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

My Personal Notes arrow_drop_up
Recommended Articles
Page :