# Sum of GCD of all numbers upto N with N itself

Given an integer N, the task is to find the sum of Greatest Common Divisors of all numbers up to N with N itself.
Examples:

Input: N = 12
Output: 40
Explanation:
GCD of [1, 12] = 1, [2, 12] = 2, [3, 12] = 3, [4, 12] = 4, [5, 12] = 1, [6, 12] = 6, [7, 12] = 1, [8, 12] = 4, [9, 12] = 3, [10, 12] = 2, [11, 12] = 1, [12, 12] = 12. The sum is (1 + 2 + 3 + 4 + 1 + 6 + 1 + 4 + 3 + 2 + 1 + 12) = 40.

Input: N = 2
Output:
Explanation:
GCD of [1, 2] = 1, [2, 2] = 2 and their sum is 3.

Naive Approach: A simple solution is to iterate over all numbers from 1 to N and find their gcd with N itself and keep on adding them.
Time Complexity: O(N * log N)

Efficient Approach:
To optimize the above-mentioned approach, we need to observe that GCD(i, N) gives one of the divisors of N. So, instead of running a loop from 1 to N, we can check for each divisor of N that how many numbers are there with GCD(i, N) same as that divisor.

Illustration:
For example N = 12, its divisors are 1, 2, 3, 4, 6, 12.
Numbers in range [1, 12] whose GCD with 12 is:

• 1 are {1, 5, 7, 11}
• 2 are {2, 10}
• 3 are {3, 9}
• 4 are {4, 8}
• 6 is {6}
• 12 is {12}

So answer is; 1*4 + 2*2 + 3*2 + 4*2 + 6*1 + 12*1 = 40.

• So we have to find the number of integers from 1 to N with GCD d, where d is a divisor of N. Let us consider x1, x2, x3, …. xn as the different integers from 1 to N such that their GCD with N is d.
• Since, GCD(xi, N) = d then GCD(xi/d, N/d) = 1
• So, count of integers from 1 to N whose GCD with N is d is Euler Totient Function of (N/d).

Below is the implementation of the above approach:

## C++

 `// C++ Program to find the Sum ` `// of GCD of all integers up to N ` `// with N itself ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Function to Find Sum of ` `// GCD of each numbers ` `int` `getCount(``int` `d, ``int` `n) ` `{ ` ` `  `    ``int` `no = n / d; ` ` `  `    ``int` `result = no; ` ` `  `    ``// Consider all prime factors ` `    ``// of no. and subtract their ` `    ``// multiples from result ` `    ``for` `(``int` `p = 2; p * p <= no; ++p) { ` ` `  `        ``// Check if p is a prime factor ` `        ``if` `(no % p == 0) { ` ` `  `            ``// If yes, then update no ` `            ``// and result ` `            ``while` `(no % p == 0) ` `                ``no /= p; ` `            ``result -= result / p; ` `        ``} ` `    ``} ` ` `  `    ``// If no has a prime factor greater ` `    ``// than sqrt(n) then at-most one such ` `    ``// prime factor exists ` `    ``if` `(no > 1) ` `        ``result -= result / no; ` ` `  `    ``// Return the result ` `    ``return` `result; ` `} ` ` `  `// Finding GCD of pairs ` `int` `sumOfGCDofPairs(``int` `n) ` `{ ` `    ``int` `res = 0; ` ` `  `    ``for` `(``int` `i = 1; i * i <= n; i++) { ` `        ``if` `(n % i == 0) { ` `            ``// Calculate the divisors ` `            ``int` `d1 = i; ` `            ``int` `d2 = n / i; ` ` `  `            ``// Return count of numbers ` `            ``// from 1 to N with GCD d with N ` `            ``res += d1 * getCount(d1, n); ` ` `  `            ``// Check if d1 and d2 are ` `            ``// equal then skip this ` `            ``if` `(d1 != d2) ` `                ``res += d2 * getCount(d2, n); ` `        ``} ` `    ``} ` ` `  `    ``return` `res; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``int` `n = 12; ` ` `  `    ``cout << sumOfGCDofPairs(n); ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java program to find the Sum ` `// of GCD of all integers up to N ` `// with N itself ` `class` `GFG{ ` ` `  `// Function to Find Sum of ` `// GCD of each numbers ` `static` `int` `getCount(``int` `d, ``int` `n) ` `{ ` `    ``int` `no = n / d; ` `    ``int` `result = no; ` ` `  `    ``// Consider all prime factors ` `    ``// of no. and subtract their ` `    ``// multiples from result ` `    ``for``(``int` `p = ``2``; p * p <= no; ++p) ` `    ``{ ` ` `  `        ``// Check if p is a prime factor ` `        ``if` `(no % p == ``0``)  ` `        ``{ ` ` `  `            ``// If yes, then update no ` `            ``// and result ` `            ``while` `(no % p == ``0``) ` `                ``no /= p; ` `            ``result -= result / p; ` `        ``} ` `    ``} ` ` `  `    ``// If no has a prime factor greater ` `    ``// than Math.sqrt(n) then at-most one such ` `    ``// prime factor exists ` `    ``if` `(no > ``1``) ` `        ``result -= result / no; ` ` `  `    ``// Return the result ` `    ``return` `result; ` `} ` ` `  `// Finding GCD of pairs ` `static` `int` `sumOfGCDofPairs(``int` `n) ` `{ ` `    ``int` `res = ``0``; ` ` `  `    ``for``(``int` `i = ``1``; i * i <= n; i++) ` `    ``{ ` `        ``if` `(n % i == ``0``) ` `        ``{ ` `             `  `            ``// Calculate the divisors ` `            ``int` `d1 = i; ` `            ``int` `d2 = n / i; ` ` `  `            ``// Return count of numbers ` `            ``// from 1 to N with GCD d with N ` `            ``res += d1 * getCount(d1, n); ` ` `  `            ``// Check if d1 and d2 are ` `            ``// equal then skip this ` `            ``if` `(d1 != d2) ` `                ``res += d2 * getCount(d2, n); ` `        ``} ` `    ``} ` `    ``return` `res; ` `} ` ` `  `// Driver code ` `public` `static` `void` `main(String[] args) ` `{ ` `    ``int` `n = ``12``; ` ` `  `    ``System.out.print(sumOfGCDofPairs(n)); ` `} ` `} ` ` `  `// This code is contributed by Amit Katiyar `

Output:

```40
```

Time Complexity: O(N)

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

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : yash2040, amit143katiyar

Article Tags :

2

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.