Vind de som van de delers van alle delers van een natuurlijk getal

Vind de som van de delers van alle delers van een natuurlijk getal
Probeer het eens op GfG Practice #practiceLinkDiv {weergave: geen! belangrijk; }

Gegeven een natuurlijk getal N de taak is om de som van de delers van alle delers van n te vinden.

Voorbeelden:  

  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 Vind de som van de delers Probeer het!

Gebruikmakend van het feit dat elk nummer N kan worden uitgedrukt als het product van priemfactoren N = blz 1 k1 x blz 2 k2 x ... waar p 1 P 2 ... zijn priemgetallen. 
Alle delers van n kunnen worden uitgedrukt als p 1 A x blz 2 B x ... waarbij 0 <= a <= k1 and 0 <= b <= k2. 
Nu zal de som van de delers de som zijn van alle machten van p 1 - P 1 P 1 1 .... P 1 k1 vermenigvuldigd met alle macht van p 2 - P 2 P 2 1 .... P 2 k1  
Som van deler van n 
= (pag 1 x blz 2 ) + (pag 1 1 x blz 2 ) +.....+ (pag 1 k1 x blz 2 ) +....+ (pag 1 x blz 2 1 ) + (pag 1 1 x blz 2 1 ) +.....+ (pag 1 k1 x blz 2 1 ) +........+ 
   (P 1 x blz 2 k2 ) + (pag 1 1 x blz 2 k2 ) +......+ (pag 1 k1 x blz 2 k2 ). 
= (pag 1 + blz 1 1 +...+ blz 1 k1 ) x blz 2 + (pag 1 + blz 1 1 +...+ blz 1 k1 ) x blz 2 1 +.......+ (pag 1 + blz 1 1 +...+ blz 1 k1 ) x blz 2 k2
= (pag 1 + blz 1 1 +...+ blz 1 k1 ) x (pag 2 + blz 2 1 +...+ blz 2 k2 ).

Nu zijn de delers van elke p A voor p als priemgetallen zijn p P 1 ...... P A . En de som van de delers zal zijn (p (a+1) - 1)/(p -1) laat het definiëren door f(p). 
Dus de som van de delers van alle delers zal zijn 
= (f(pag 1 ) + f(pag 1 1 ) +...+ f(pag 1 k1 )) X (f(pag 2 ) + f(pag 2 1 ) +...+ f(pag 2 k2 )).

Dus gegeven een getal n door priemfactorisatie kunnen we de som van de delers van alle delers vinden. Maar in dit probleem wordt gegeven dat n het product is van een element van een array. Zoek dus de priemfactorisatie van elk element en gebruik het feit a B x een C = een b+c .

Hieronder vindt u de implementatie van deze aanpak:  

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>   

Uitgang:  

28 

Tijdcomplexiteit: O(?n log n) 
Hulpruimte: Op)

Optimalisaties: 
Voor de gevallen waarin er meerdere invoergegevens zijn waarvoor we de waarde moeten vinden die we kunnen gebruiken Zeef van Eratosthenes zoals besproken in dit na.


 

Quiz maken