Related Articles
Sum of all divisors from 1 to n
• Difficulty Level : Medium
• Last Updated : 24 Mar, 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'#includeusing 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 codeint 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 coden = 4print( divisorSum(n))n = 5print( 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

 

## Javascript

 

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'#includeusing 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 codeint 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 codeint 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 coden = 4print( divisorSum(n))n = 5print( 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

 

## Javascript

 // Javascript 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){    let sum = 0;    for (let i = 1; i <= n; ++i)        sum += Math.floor(n / i) * i;    return sum;}  // Driver codelet n = 4;document.write(divisorSum(n) + "
");n = 5;document.write(divisorSum(n) + "
");  // This code is contributed by _saurabh_jaiswal.

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 exponentiationRefer 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 primell modinv(ll x){    return power(x, mod - 2, mod);}  // Function to calculate sum from 1 to nll 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 primedef modinv(x):    return power(x, mod - 2, mod);  # Function to calculate sum# from 1 to ndef 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 codeif __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 codestatic 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