Hitta summan av divisorer av alla divisorer för ett naturligt tal

Hitta summan av divisorer av alla divisorer för ett naturligt tal
Prova det på GfG Practice #practiceLinkDiv { display: ingen !viktigt; }

Givet ett naturligt tal n uppgiften är att hitta summan av divisorer av alla divisorer av n.

Exempel:  

  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 Hitta summan av divisorer Prova det!

Med hjälp av det faktum att vilket nummer som helst n kan uttryckas som produkt av primtalsfaktorer n = sid 1 k1 x sid 2 k2 x ... där sid 1 sid 2 ... är primtal. 
Alla delar av n kan uttryckas som p 1 a x sid 2 b x ... där 0 <= a <= k1 and 0 <= b <= k2. 
Nu blir summan av divisorer summan av all potens av p 1 - sid 1 sid 1 1 .... sid 1 k1 multiplicerat med all potens av p 2 - sid 2 sid 2 1 .... sid 2 k1  
Summan av Divisor av n 
= (sid 1 x sid 2 ) + (sid 1 1 x sid 2 ) +.....+ (s 1 k1 x sid 2 ) +....+ (s 1 x sid 2 1 ) + (sid 1 1 x sid 2 1 ) +.....+ (s 1 k1 x sid 2 1 ) +........+ 
   (sid 1 x sid 2 k2 ) + (sid 1 1 x sid 2 k2 ) +......+ (s 1 k1 x sid 2 k2 ). 
= (sid 1 + sid 1 1 +...+ sid 1 k1 ) x sid 2 + (sid 1 + sid 1 1 +...+ sid 1 k1 ) x sid 2 1 +......+ (s 1 + sid 1 1 +...+ sid 1 k1 ) x sid 2 k2
= (sid 1 + sid 1 1 +...+ sid 1 k1 ) x (s 2 + sid 2 1 +...+ sid 2 k2 ).



Nu är divisorerna för varje sid a för p som primtal är p sid 1 ...... sid a . Och summan av divisorer kommer att vara (s (a+1) - 1)/(p -1) låt den definieras av f(p). 
Så summan av divisorer av alla divisorer blir 
= (f(sid 1 ) + f(sid 1 1 ) +...+ f(s 1 k1 )) x (f(sid 2 ) + f(sid 2 1 ) +...+ f(s 2 k2 )).

Så givet ett tal n genom primtalsfaktorisering kan vi hitta summan av divisorer för alla divisorer. Men i detta problem får vi att n är produkten av elementet i arrayen. Så hitta primtalsfaktorisering av varje element och genom att använda faktumet a b x a c = a b+c .

Nedan följer implementeringen av detta tillvägagångssätt:  

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>   

Produktion:  

28 

Tidskomplexitet: O(?n log n) 
Hjälputrymme: På)

Optimering: 
För de fall då det finns flera ingångar som vi behöver hitta värdet vi kan använda Sil av Eratosthenes som diskuterats i detta posta.


 

Skapa frågesport

Top Artiklar

Kategori

Intressanta Artiklar