Sum of LCM(1, n), LCM(2, n), LCM(3, n), ... , LCM(n, n)

21 Jun, 2022
Given an integer n, the task is to find the sum: 
LCM(1, n) + LCM(2, n) + LCM(3, n) + ... + LCM(n, n) where LCM(i, n) is the Least Common Multiple of i and n. 
Examples:  
Input: 3 Output: 10 LCM(1, 3) + LCM(2, 3) + LCM(3, 3) = 3 + 6 + 3 = 12
Input: 5 Output: 55 LCM(1, 5) + LCM(2, 5) + LCM(3, 5) + LCM(4, 5) + LCM(5, 5) = 55 
Naive Approach: LCM of two numbers a and b = (a * b) / gcd(a, b) where gcd(a, b) is the Greatest Common Divisor of a and b.  
Calculate the values of individual LCM for all pairs starting from (1, n) to (n, n).
Sum all the LCM results from the previous step.
Print the sum in the end.
Below is the implementation of the above approach: 
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;#define ll long long int // Function to calculate the required LCM sumll lcmSum(long long n){    ll sum = 0;     for (long long int i = 1; i <= n; i++) {         // GCD of i and n        long long int gcd = __gcd(i, n);         // LCM of i and n i.e. (i * n) / gcd(i, n)        long long int lcm = (i * n) / gcd;         // Update sum        sum = sum + lcm;    }     return sum;} // Driver codeint main(){    int n = 3;     cout << lcmSum(n);     return 0;}
// Java implementation of the approachimport java.util.*; class GFG{ // return gcd of two numbersstatic int gcd(int a,int b){     // Everything divides 0    if (a == 0)        return b;    if (b == 0)        return a;         // base case    if (a == b)        return a;         // a is greater    if (a > b)        return gcd(a - b, b);    return gcd(a, b - a); } // Function to calculate the required LCM sumstatic int lcmSum(int n){    int sum = 0;     for (int i = 1; i <= n; i++)    {         // GCD of i and n        int gcd = gcd(i, n);         // LCM of i and n i.e. (i * n) / gcd(i, n)        int lcm = (i * n) / gcd;         // Update sum        sum = sum + lcm;    }     return sum;} // Driver codepublic static void main(String args[]){    int n = 3;     System.out.println(lcmSum(n));}} // This code is contributed by// Surendra _Gangwar
# Python3 implementation of the approachimport math # Function to calculate the required LCM sumdef lcmSum(n):     Sum = 0    for i in range(1, n + 1):         # GCD of i and n        gcd = math.gcd(i, n)         # LCM of i and n i.e. (i * n) / gcd(i, n)        lcm = (i * n) // gcd         # Update sum        Sum = Sum + lcm     return Sum # Driver codeif __name__ == "__main__":     n = 3    print(lcmSum(n)) # This code is contributed by Rituraj Jain
// C# implementation of the approachclass GFG{ // return gcd of two numbersstatic int gcd1(int a,int b){     // Everything divides 0    if (a == 0)        return b;    if (b == 0)        return a;         // base case    if (a == b)        return a;         // a is greater    if (a > b)        return gcd1(a - b, b);    return gcd1(a, b - a); } // Function to calculate the required LCM sumstatic int lcmSum(int n){    int sum = 0;     for (int i = 1; i <= n; i++)    {         // GCD of i and n        int gcd = gcd1(i, n);         // LCM of i and n i.e. (i * n) / gcd(i, n)        int lcm = (i * n) / gcd;         // Update sum        sum = sum + lcm;    }     return sum;} // Driver codestatic void Main(){    int n = 3;     System.Console.WriteLine(lcmSum(n));}} // This code is contributed by chandan_jnu
<?php// PHP implementation of the approach function __gcd($a, $b){    if($b == 0)    return $a;    return __gcd($b, $a % $b);} // Function to calculate the required LCM sumfunction lcmSum($n){    $sum = 0;     for ($i = 1; $i <= $n; $i++)    {         // GCD of i and n        $gcd = __gcd($i, $n);         // LCM of i and n i.e. (i * n) / gcd(i, n)        $lcm = ($i * $n) / $gcd;         // Update sum        $sum = $sum + $lcm;    }     return $sum;} // Driver code$n = 3; echo lcmSum($n); // This code is contributed by chandan_jnu?>
<script> // Javascript implementation of the approach // return gcd of two numbersfunction gcd(a, b){         // Everything divides 0    if (a == 0)        return b;    if (b == 0)        return a;         // base case    if (a == b)        return a;         // a is greater    if (a > b)        return gcd(a - b, b);             return gcd(a, b - a);} // Function to calculate the required LCM sumfunction lcmSum(n){    var sum = 0;     for(var i = 1; i <= n; i++)    {         // GCD of i and n        var _gcd = gcd(i, n);         // LCM of i and n i.e. (i * n) / gcd(i, n)        var lcm = (i * n) / _gcd;         // Update sum        sum = sum + lcm;    }    return sum;} // Driver codevar n = 3; document.write(lcmSum(n));     // This code is contributed by Ankita saini    </script>
12
 
Time Complexity: O(n * logn), where n represents the given integer.
Auxiliary Space: O(1), no extra space is required, so it is a constant. 
Efficient Approach: Using Euler Totient Function, ∑LCM(i, n) = ((∑(d * ETF(d)) + 1) * n) / 2 where ETF(d) is Euler totient function of d and d belongs to the set of divisors of n.
Example: 
Let n be 5 then LCM(1, 5) + LCM(2, 5) + LCM(3, 5) + LCM(4, 5) + LCM(5, 5) = 5 + 10 + 15 + 20 + 5 = 55With Euler Totient Function: All divisors of 5 are {1, 5} Hence, ((1*ETF(1) + 5*ETF(5) + 1) * 5) / 2 = 55 
Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std; #define n 1000002#define ll long long int ll phi[n + 2], ans[n + 2]; // Euler totient Functionvoid ETF(){    for (int i = 1; i <= n; i++) {        phi[i] = i;    }     for (int i = 2; i <= n; i++) {        if (phi[i] == i) {            phi[i] = i - 1;            for (int j = 2 * i; j <= n; j += i) {                phi[j] = (phi[j] * (i - 1)) / i;            }        }    }} // Function to return the required LCM sumll LcmSum(int m){    ETF();     for (int i = 1; i <= n; i++) {         // Summation of d * ETF(d) where        // d belongs to set of divisors of n        for (int j = i; j <= n; j += i) {            ans[j] += (i * phi[i]);        }    }     ll answer = ans[m];    answer = (answer + 1) * m;    answer = answer / 2;    return answer;} // Driver codeint main(){    int m = 5;     cout << LcmSum(m);     return 0;}
// Java implementation of the approachclass GFG{     static int n = 1000002; static int[] phi = new int[n + 2];static int[] ans = new int[n + 2]; // Euler totient Functionstatic void ETF(){    for (int i = 1; i <= n; i++)    {        phi[i] = i;    }     for (int i = 2; i <= n; i++)    {        if (phi[i] == i)        {            phi[i] = i - 1;            for (int j = 2 * i; j <= n; j += i)            {                phi[j] = (phi[j] * (i - 1)) / i;            }        }    }} // Function to return the required LCM sumstatic int LcmSum(int m){    ETF();     for (int i = 1; i <= n; i++)    {         // Summation of d * ETF(d) where        // d belongs to set of divisors of n        for (int j = i; j <= n; j += i)        {            ans[j] += (i * phi[i]);        }    }     int answer = ans[m];    answer = (answer + 1) * m;    answer = answer / 2;    return answer;} // Driver codepublic static void main (String[] args){    int m = 5;    System.out.println(LcmSum(m));}} // This code is contributed by chandan_jnu
# Python3 implementation of the approachn = 100002; phi = [0] * (n + 2);ans = [0] * (n + 2); # Euler totient Functiondef ETF():     for i in range(1, n + 1):        phi[i] = i;     for i in range(2, n + 1):        if (phi[i] == i):            phi[i] = i - 1;            for j in range(2 * i, n + 1, i):                phi[j] = (phi[j] * (i - 1)) // i; # Function to return the required LCM sumdef LcmSum(m):    ETF();     for i in range(1, n + 1):         # Summation of d * ETF(d) where        # d belongs to set of divisors of n        for j in range(i, n + 1, i):            ans[j] += (i * phi[i]);     answer = ans[m];    answer = (answer + 1) * m;    answer = answer // 2;    return answer; # Driver codem = 5;print(LcmSum(m)); # This code is contributed# by chandan_jnu
// C# implementation of the approachusing System; class GFG{static int n = 1000002; static int[] phi = new int[n + 2];static int[] ans = new int[n + 2]; // Euler totient Functionstatic void ETF(){    for (int i = 1; i <= n; i++)    {        phi[i] = i;    }     for (int i = 2; i <= n; i++)    {        if (phi[i] == i)        {            phi[i] = i - 1;            for (int j = 2 * i; j <= n; j += i)            {                phi[j] = (phi[j] * (i - 1)) / i;            }        }    }} // Function to return the required LCM sumstatic int LcmSum(int m){    ETF();     for (int i = 1; i <= n; i++)    {         // Summation of d * ETF(d) where        // d belongs to set of divisors of n        for (int j = i; j <= n; j += i)        {            ans[j] += (i * phi[i]);        }    }     int answer = ans[m];    answer = (answer + 1) * m;    answer = answer / 2;    return answer;} // Driver codestatic void Main(){    int m = 5;    Console.WriteLine(LcmSum(m));}} // This code is contributed by chandan_jnu
<?php// PHP implementation of the approach$n = 10002; $phi = array_fill(0, $n + 2, 0);$ans = array_fill(0, $n + 2, 0); // Euler totient Functionfunction ETF(){    global $phi, $n;    for ($i = 1; $i <= $n; $i++)    {        $phi[$i] = $i;    }     for ($i = 2; $i <= $n; $i++)    {        if ($phi[$i] == $i)        {            $phi[$i] = $i - 1;            for ($j = 2 * $i; $j <= $n; $j += $i)            {                $phi[$j] = (int)(($phi[$j] *                                 ($i - 1)) / $i);            }        }    }} // Function to return the required LCM sumfunction LcmSum($m){    ETF();    global $ans, $n, $phi;         for ($i = 1; $i <= $n; $i++)    {         // Summation of d * ETF(d) where        // d belongs to set of divisors of n        for ($j = $i; $j <= $n; $j += $i)        {            $ans[$j] += ($i * $phi[$i]);        }    }     $answer = $ans[$m];    $answer = ($answer + 1) * $m;    $answer = (int)($answer / 2);    return $answer;} // Driver code$m = 5; echo LcmSum($m); // This code is contributed by chandan_jnu?>
<script> // javascript implementation of the approach   var n = 1000002;     var phi = Array(n + 2).fill(0);    var ans = Array(n + 2).fill(0);     // Euler totient Function    function ETF() {        for (i = 1; i <= n; i++) {            phi[i] = i;        }         for (i = 2; i <= n; i++) {            if (phi[i] == i) {                phi[i] = i - 1;                for (j = 2 * i; j <= n; j += i) {                    phi[j] = (phi[j] * (i - 1)) / i;                }            }        }    }     // Function to return the required LCM sum    function LcmSum(m) {        ETF();         for (i = 1; i <= n; i++) {             // Summation of d * ETF(d) where            // d belongs to set of divisors of n            for (j = i; j <= n; j += i) {                ans[j] += (i * phi[i]);            }        }         var answer = ans[m];        answer = (answer + 1) * m;        answer = answer / 2;        return answer;    }     // Driver code        var m = 5;        document.write(LcmSum(m)); // This code is contributed by aashish1995</script>
55
 
Time Complexity: O(N * logN)Auxiliary Space: O(N)
Mostafijur Rahaman
rituraj_jain
SURENDRA_GANGWAR
Chandan_Kumar
maxitrucbonbec
ankita_saini
aashish1995
pankajsharmagfg
samim2000
GCD-LCM
Technical Scripter 2018
Algorithms
Mathematical
Technical Scripter
Mathematical
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
What is Hashing | A Complete Tutorial
Find if there is a path between two vertices in an undirected graph
How to Start Learning DSA?
Complete Roadmap To Learn DSA From Scratch
Types of Complexity Classes | P, NP, CoNP, NP hard and NP complete
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays