מצא את סכום המחלקים של כל המחלקים של מספר טבעי
#practiceLinkDiv { display: none !חשוב; } ניתן מספר טבעי נ המשימה היא למצוא את סכום המחלקים של כל המחלקים של n.
דוגמאות:
Input : n = 54 Output : 232 Divisors of 54 = 1 2 3 6 9 18 27 54. Sum of divisors of 1 2 3 6 9 18 27 54 are 1 3 4 12 13 39 40 120 respectively. Sum of divisors of all the divisors of 54 = 1 + 3 + 4 + 12 + 13 + 39 + 40 + 120 = 232. Input : n = 10 Output : 28 Divisors of 10 are 1 2 5 10 Sums of divisors of divisors are 1 3 6 18. Overall sum = 1 + 3 + 6 + 18 = 28Recommended Practice מצא את סכום המחלקים נסה את זה!
שימוש בעובדה שכל מספר נ ניתן לבטא כתוצר של גורמים ראשוניים נ = p 1 k1 x p 2 k2 x ... שבו p 1 ע 2 ... הם מספרים ראשוניים.
ניתן לבטא את כל המחלקים של n כ-p 1 א x p 2 ב x ... שבו 0 <= a <= k1 and 0 <= b <= k2.
כעת סכום המחלקים יהיה סכום כל העוצמה של p 1 - עמ' 1 ע 1 1 .... עמ' 1 k1 מוכפל בכל החזקה של p 2 - עמ' 2 ע 2 1 .... עמ' 2 k1
סכום המחלק של n
= (עמ' 1 x p 2 ) + (עמ' 1 1 x p 2 ) +.....+ (עמ' 1 k1 x p 2 ) +....+ (עמ' 1 x p 2 1 ) + (עמ' 1 1 x p 2 1 ) +.....+ (עמ' 1 k1 x p 2 1 ) +........+
(עמ' 1 x p 2 k2 ) + (עמ' 1 1 x p 2 k2 ) +......+ (עמ' 1 k1 x p 2 k2 ).
= (עמ' 1 + עמ' 1 1 +...+ עמ' 1 k1 ) x p 2 + (עמ' 1 + עמ' 1 1 +...+ עמ' 1 k1 ) x p 2 1 +......+ (עמ' 1 + עמ' 1 1 +...+ עמ' 1 k1 ) x p 2 k2 .
= (עמ' 1 + עמ' 1 1 +...+ עמ' 1 k1 ) x (עמ' 2 + עמ' 2 1 +...+ עמ' 2 k2 ).
כעת המחלקים של כל ע א עבור p כראשוני הם p ע 1 ...... עמ' א . וסכום המחלקים יהיה (עמ' (a+1) - 1)/(p -1) תן לזה להגדיר על ידי f(p).
אז סכום המחלקים של כל המחלקים יהיה
= (f(p 1 ) + f(p 1 1 ) +...+ f(p 1 k1 )) x (f(p 2 ) + f(p 2 1 ) +...+ f(p 2 k2 )).
אז בהינתן מספר n על ידי פירוק ראשוני נוכל למצוא את סכום המחלקים של כל המחלקים. אבל בבעיה זו ניתן לנו ש-n הוא מכפלה של אלמנט של מערך. אז מצא פירוק ראשוני של כל אלמנט ועל ידי שימוש בעובדה א ב x א ג = א b+c .
להלן היישום של גישה זו:
C++ // C++ program to find sum of divisors of all // the divisors of a natural number. #include using namespace std ; // Returns sum of divisors of all the divisors // of n int sumDivisorsOfDivisors ( int n ) { // Calculating powers of prime factors and // storing them in a map mp[]. map < int int > mp ; for ( int j = 2 ; j <= sqrt ( n ); j ++ ) { int count = 0 ; while ( n % j == 0 ) { n /= j ; count ++ ; } if ( count ) mp [ j ] = count ; } // If n is a prime number if ( n != 1 ) mp [ n ] = 1 ; // For each prime factor calculating (p^(a+1)-1)/(p-1) // and adding it to answer. int ans = 1 ; for ( auto it : mp ) { int pw = 1 ; int sum = 0 ; for ( int i = it . second + 1 ; i >= 1 ; i -- ) { sum += ( i * pw ); pw *= it . first ; } ans *= sum ; } return ans ; } // Driven Program int main () { int n = 10 ; cout < < sumDivisorsOfDivisors ( n ); return 0 ; }
Java // Java program to find sum of divisors of all // the divisors of a natural number. import java.util.HashMap ; class GFG { // Returns sum of divisors of all the divisors // of n public static int sumDivisorsOfDivisors ( int n ) { // Calculating powers of prime factors and // storing them in a map mp[]. HashMap < Integer Integer > mp = new HashMap <> (); for ( int j = 2 ; j <= Math . sqrt ( n ); j ++ ) { int count = 0 ; while ( n % j == 0 ) { n /= j ; count ++ ; } if ( count != 0 ) mp . put ( j count ); } // If n is a prime number if ( n != 1 ) mp . put ( n 1 ); // For each prime factor calculating (p^(a+1)-1)/(p-1) // and adding it to answer. int ans = 1 ; for ( HashMap . Entry < Integer Integer > entry : mp . entrySet ()) { int pw = 1 ; int sum = 0 ; for ( int i = entry . getValue () + 1 ; i >= 1 ; i -- ) { sum += ( i * pw ); pw *= entry . getKey (); } ans *= sum ; } return ans ; } // Driver code public static void main ( String [] args ) { int n = 10 ; System . out . println ( sumDivisorsOfDivisors ( n )); } } // This code is contributed by // sanjeev2552
Python3 # Python3 program to find sum of divisors # of all the divisors of a natural number. import math as mt # Returns sum of divisors of all # the divisors of n def sumDivisorsOfDivisors ( n ): # Calculating powers of prime factors # and storing them in a map mp[]. mp = dict () for j in range ( 2 mt . ceil ( mt . sqrt ( n ))): count = 0 while ( n % j == 0 ): n //= j count += 1 if ( count ): mp [ j ] = count # If n is a prime number if ( n != 1 ): mp [ n ] = 1 # For each prime factor calculating # (p^(a+1)-1)/(p-1) and adding it to answer. ans = 1 for it in mp : pw = 1 summ = 0 for i in range ( mp [ it ] + 1 0 - 1 ): summ += ( i * pw ) pw *= it ans *= summ return ans # Driver Code n = 10 print ( sumDivisorsOfDivisors ( n )) # This code is contributed # by mohit kumar 29
C# // C# program to find sum of divisors of all // the divisors of a natural number. using System ; using System.Collections.Generic ; class GFG { // Returns sum of divisors of // all the divisors of n public static int sumDivisorsOfDivisors ( int n ) { // Calculating powers of prime factors and // storing them in a map mp[]. Dictionary < int int > mp = new Dictionary < int int > (); for ( int j = 2 ; j <= Math . Sqrt ( n ); j ++ ) { int count = 0 ; while ( n % j == 0 ) { n /= j ; count ++ ; } if ( count != 0 ) mp . Add ( j count ); } // If n is a prime number if ( n != 1 ) mp . Add ( n 1 ); // For each prime factor // calculating (p^(a+1)-1)/(p-1) // and adding it to answer. int ans = 1 ; foreach ( KeyValuePair < int int > entry in mp ) { int pw = 1 ; int sum = 0 ; for ( int i = entry . Value + 1 ; i >= 1 ; i -- ) { sum += ( i * pw ); pw = entry . Key ; } ans *= sum ; } return ans ; } // Driver code public static void Main ( String [] args ) { int n = 10 ; Console . WriteLine ( sumDivisorsOfDivisors ( n )); } } // This code is contributed // by Princi Singh
JavaScript < script > // Javascript program to find sum of divisors of all // the divisors of a natural number. // Returns sum of divisors of all the divisors // of n function sumDivisorsOfDivisors ( n ) { // Calculating powers of prime factors and // storing them in a map mp[]. let mp = new Map (); for ( let j = 2 ; j <= Math . sqrt ( n ); j ++ ) { let count = 0 ; while ( n % j == 0 ) { n = Math . floor ( n / j ); count ++ ; } if ( count != 0 ) mp . set ( j count ); } // If n is a prime number if ( n != 1 ) mp . set ( n 1 ); // For each prime factor calculating (p^(a+1)-1)/(p-1) // and adding it to answer. let ans = 1 ; for ( let [ key value ] of mp . entries ()) { let pw = 1 ; let sum = 0 ; for ( let i = value + 1 ; i >= 1 ; i -- ) { sum += ( i * pw ); pw = key ; } ans *= sum ; } return ans ; } // Driver code let n = 10 ; document . write ( sumDivisorsOfDivisors ( n )); // This code is contributed by patel2127 < /script>
תְפוּקָה:
28
מורכבות זמן: O(?n log n)
מרחב עזר: עַל)
אופטימיזציות:
למקרים שבהם יש מספר כניסות שעבורן אנחנו צריכים למצוא את הערך שבו נוכל להשתמש מסננת של ארוטוסטנס כפי שנדון ב זֶה שֶׁלְאַחַר.