Сумма НОК (1, n), НОК (2, n), НОК (3, n),…, НОК (n, n)
Для целого числа n нужно найти сумму:
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.
Примеры:
Input: 3
Output: 10
LCM(1, 3) + LCM(2, 3) + LCM(3, 3) = 3 + 6 + 3 = 12Input: 5
Output: 55
LCM(1, 5) + LCM(2, 5) + LCM(3, 5) + LCM(4, 5) + LCM(5, 5) = 55
Наивный подход: НОК двух чисел a и b = (a * b) / gcd (a, b), где gcd (a, b) - наибольший общий делитель чисел a и b .
- Вычислите значения индивидуального НОК для всех пар, начиная с (1, n) и заканчивая (n, n) .
- Просуммируйте все результаты НОК из предыдущего шага.
- В конце выведите сумму.
Ниже представлена реализация описанного выше подхода:
C ++
// 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 ie (i * n) / gcd(i, n) long long int lcm = (i * n) / gcd; // Update sum sum = sum + lcm; } sum; return}// 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 ie (i * n) / gcd(i, n) int lcm = (i * n) / gcd; // Update sum sum = sum + lcm; } sum; return}// Driver codepublic static void main(String args[]){ int n = 3 ; System.out.println(lcmSum(n));}}// This code is contributed by// Surendra _Gangwar |
Python3
# 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 ie (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 #
// 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 ie (i * n) / gcd(i, n) int lcm = (i * n) / gcd; // Update sum sum = sum + lcm; } sum; return}// Driver codestatic void Main(){ int n = 3; System.Console.WriteLine(lcmSum(n));}}// This code is contributed by chandan_jnu |
PHP
<?php// PHP implementation of the approachfunction __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 ie (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?> |
Javascript
<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 ie (i * n) / gcd(i, n) var lcm = (i * n) / _gcd; // Update sum sum = sum + lcm; } sum; return}// Driver codevar n = 3;document.write(lcmSum(n)); // This code is contributed by Ankita saini </script> |
12
Эффективный подход: использование функции Эйлера Totient,
∑LCM (i, n) = ((∑ (d * ETF (d)) + 1) * n) / 2
где ETF (d) - функция Эйлера от d, а d принадлежит множеству делителей n .
Пример:
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
= 55
With Euler Totient Function:
All divisors of 5 are {1, 5}
Hence, ((1*ETF(1) + 5*ETF(5) + 1) * 5) / 2 = 55
Ниже представлена реализация описанного выше подхода:
C ++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;#define n 1000002#define ll long long intll 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
# 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 #
// 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));}РЕКОМЕНДУЕМЫЕ СТАТЬИ |