Troba la suma dels divisors de tots els divisors d'un nombre natural

Troba la suma dels divisors de tots els divisors d'un nombre natural
Prova-ho a GfG Practice #practiceLinkDiv { mostrar: cap !important; }

Donat un nombre natural n la tasca és trobar la suma de divisors de tots els divisors de n.

Exemples:  

  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 Troba la suma de divisors Prova-ho!

Utilitzant el fet que qualsevol nombre n es pot expressar com a producte de factors primers n = pàg 1 k1 x pàg 2 k2 x ... on p 1 pàg 2 ... són nombres primers. 
Tots els divisors de n es poden expressar com p 1 a x pàg 2 b x... on 0 <= a <= k1 and 0 <= b <= k2. 
Ara la suma de divisors serà la suma de tota la potència de p 1 - pàg 1 pàg 1 1 .... pàg 1 k1 multiplicat per tota la potència de p 2 - pàg 2 pàg 2 1 .... pàg 2 k1  
Suma del divisor de n 
= (pàg 1 x pàg 2 ) + (pàg 1 1 x pàg 2 ) .....+ (pàg 1 k1 x pàg 2 ) +....+ (pàg 1 x pàg 2 1 ) + (pàg 1 1 x pàg 2 1 ) .....+ (pàg 1 k1 x pàg 2 1 ) ........+ 
   (pàg 1 x pàg 2 k2 ) + (pàg 1 1 x pàg 2 k2 ) +......+ (pàg 1 k1 x pàg 2 k2 ). 
= (pàg 1 + pàg 1 1 +...+ pàg 1 k1 ) x pàg 2 + (pàg 1 + pàg 1 1 +...+ pàg 1 k1 ) x pàg 2 1 +.......+ (pàg 1 + pàg 1 1 +...+ pàg 1 k1 ) x pàg 2 k2
= (pàg 1 + pàg 1 1 +...+ pàg 1 k1 ) x (pàg 2 + pàg 2 1 +...+ pàg 2 k2 ).

Ara els divisors de qualsevol p a perquè p com a primers són p pàg 1 ...... pàg a . I la suma dels divisors serà (p (a+1) - 1)/(p -1) deixeu-lo definir per f(p). 
Així que la suma dels divisors de tots els divisors serà 
= (f (pàg 1 ) + f (pàg 1 1 ) +...+ f(p 1 k1 )) x (f(pàg 2 ) + f (pàg 2 1 ) +...+ f(p 2 k2 )).

Així doncs, donat un nombre n per factorització primera, podem trobar la suma de divisors de tots els divisors. Però en aquest problema se'ns dóna que n és producte de l'element de la matriu. Per tant, trobeu la factorització primeres de cada element i utilitzant el fet a b x a c = a b+c .

A continuació es mostra la implementació d'aquest enfocament:  

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>   

Sortida:  

28 

Complexitat temporal: O(?n registre n) 
Espai auxiliar: O(n)

Optimitzacions: 
Per als casos en què hi ha diverses entrades per als quals necessitem trobar el valor que podem utilitzar Sedós d'Eratostenes tal com s'ha comentat a això publicació.


 

Crea un qüestionari