Trouver la somme des diviseurs de tous les diviseurs d'un nombre naturel

Trouver la somme des diviseurs de tous les diviseurs d'un nombre naturel
Essayez-le sur GfG Practice #practiceLinkDiv { display : aucun !important; }

Étant donné un nombre naturel n la tâche est de trouver la somme des diviseurs de tous les diviseurs 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 Trouver la somme des diviseurs Essayez-le !

En utilisant le fait que n'importe quel nombre n peut être exprimé comme produit de facteurs premiers n =p 1 k1 xp 2 k2 x ... où p 1 p 2 ... sont des nombres premiers. 
Tous les diviseurs de n peuvent être exprimés par p 1 un xp 2 b x ... où 0 <= a <= k1 and 0 <= b <= k2. 
Maintenant, la somme des diviseurs sera la somme de toutes les puissances de p 1 -p 1 p 1 1 ....p 1 k1 multiplié par toute la puissance de p 2 -p 2 p 2 1 ....p 2 k1  
Somme du diviseur de n 
= (p 1 xp 2 ) + (p 1 1 xp 2 ) +.....+ (p 1 k1 xp 2 ) +....+ (p 1 xp 2 1 ) + (p 1 1 xp 2 1 ) +.....+ (p 1 k1 xp 2 1 ) +........+ 
   (p 1 xp 2 k2 ) + (p 1 1 xp 2 k2 ) +......+ (p 1 k1 xp 2 k2 ). 
= (p 1 +p 1 1 +...+p 1 k1 ) xp 2 + (p 1 +p 1 1 +...+p 1 k1 ) xp 2 1 +.......+ (p 1 +p 1 1 +...+p 1 k1 ) xp 2 k2
= (p 1 +p 1 1 +...+p 1 k1 ) x (p 2 +p 2 1 +...+p 2 k2 ).

Maintenant, les diviseurs de n'importe quel p un pour p comme premier sont p p 1 ......p un . Et la somme des diviseurs sera (p (a+1) - 1)/(p -1) laissez-le définir par f(p). 
Donc la somme des diviseurs de tous les diviseurs sera 
= (f(p 1 ) + f(p 1 1 ) +...+ f(p 1 k1 )) x (f(p 2 ) + f(p 2 1 ) +...+ f(p 2 k2 )).

Ainsi, étant donné un nombre n par factorisation première, nous pouvons trouver la somme des diviseurs de tous les diviseurs. Mais dans ce problème, on nous dit que n est le produit d’un élément du tableau. Trouvez donc la factorisation première de chaque élément et en utilisant le fait a b x un c = un b+c .

Ci-dessous la mise en œuvre de cette approche :  

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>   

Sortir:  

28 

Complexité temporelle : O(?n journal n) 
Espace auxiliaire : Sur)

Optimisations : 
Pour les cas où il existe plusieurs entrées pour lesquelles nous devons trouver la valeur que nous pouvons utiliser Tamis d'Ératosthène comme discuté dans ce poste.


 

Créer un quiz