logo

Наћи збир делилаца свих делилаца природног броја

Пробајте на ГфГ пракси ' title= #працтицеЛинкДив { дисплаи: ноне !импортант; }

Дат је природан број н задатак је пронаћи збир делилаца свих делилаца од н.

Примери:  

  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 = 28
Recommended Practice Наћи збир делилаца Покушајте!

Користећи чињеницу да било који број н може се изразити као производ простих фактора н = стр1к1к п2к2к ... где је стр1стр2... су прости бројеви. 
Сви делиоци од н могу се изразити као п1ак п2бк ... где је 0<= a <= k1 and 0 <= b <= k2. 
Сада ће збир делилаца бити збир свих степена п1- стр1стр11.... стр1к1помножено са свим степеном п2- стр2стр21.... стр2к1 
Збир делитеља н 
= (стр1к п2) + (стр11к п2) +.....+ (стр1к1к п2) +....+ (стр1к п21) + (стр11к п21) +.....+ (стр1к1к п21) +........+ 
   (стр1к п2к2) + (стр11к п2к2) +......+ (стр1к1к п2к2). 
= (стр1+ стр11+...+ стр1к1) к п2+ (стр1+ стр11+...+ стр1к1) к п21+.......+ (стр1+ стр11+...+ стр1к1) к п2к2
= (стр1+ стр11+...+ стр1к1) к (стр2+ стр21+...+ стр2к2).



Сада су делиоци било ког паза п као прости су пстр1...... стра. А збир делилаца ће бити (стр(а+1)- 1)/(п -1) нека дефинише са ф(п). 
Дакле, збир делилаца свих делилаца ће бити 
= (ф(стр1) + ф(стр11) +...+ ф(стр1к1)) к (ф(стр2) + ф(стр21) +...+ ф(стр2к2)).

Дакле, дат број н помоћу растављања на просте факторе, можемо наћи збир делилаца свих делилаца. Али у овом задатку нам је дато да је н производ елемента низа. Дакле, пронађите основну факторизацију сваког елемента и користећи чињеницу абк ац= аб+ц.

Испод је примена овог приступа:  

азбука и бројеви
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

Временска сложеност: О(?н лог н) 
Помоћни простор: О(н)

Оптимизације: 
За случајеве када постоји више улаза за које треба да нађемо вредност коју можемо да користимо Ератостеново сито како се говори у ово пост.


 

Креирај квиз