Advertisement
mfgnik

Untitled

Feb 3rd, 2021
844
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4.  
  5. bool IsPrime(int64_t number) {
  6.     int64_t divisor = 2;
  7.     while (divisor * divisor <= number) {
  8.         if (number % divisor == 0) {
  9.             return false;
  10.         }
  11.         ++divisor;
  12.     }
  13.     return true;
  14. }
  15.  
  16. int64_t MinDivisor(int64_t number) {
  17.     int64_t divisor = 2;
  18.     while (divisor * divisor <= number) {
  19.         if (number % divisor == 0) {
  20.             return divisor;
  21.         }
  22.         ++divisor;
  23.     }
  24.     return number;
  25. }
  26.  
  27. // n = p_1^q_1 * p_2^q_2 ... p_n^q_n
  28.  
  29. // 27 = {3: 3}
  30.  
  31.  
  32. // p^n: n + 1
  33. // pq: 4
  34. // p^n q^m: (n + 1)(m + 1)
  35. // n = p_1^q_1 * p_2^q_2 ... p_n^q_n: (q_1 + 1)...(q_n + 1)
  36.  
  37. int64_t kPrime = 1e9 + 9;
  38.  
  39. int64_t Pow(int64_t a, int64_t n, int64_t p) {
  40.     if (n == 0) {
  41.         return 1;
  42.     }
  43.     if (n % 2 == 0) {
  44.         return Pow(a * a, n / 2, p) % p;
  45.     }
  46.     return Pow(a, n - 1, p) * a % p;
  47. }
  48.  
  49.  
  50. // 2^17 = 2^16 * 2 = (2^8)^2 * 2 = (((2^2)^2)^2)^2 * 2
  51. // log n
  52.  
  53. std::unordered_map<int64_t, int64_t> Factorization(int64_t number) {
  54.     int64_t divisor = 2;
  55.     std::unordered_map<int64_t, int64_t> factorization;
  56.     while (divisor * divisor <= number) {
  57.         while (number % divisor == 0) {
  58.             number /= divisor;
  59.             ++factorization[divisor];
  60.         }
  61.         ++divisor;
  62.     }
  63.     if (number > 1) {
  64.         factorization[number] = 1;
  65.     }
  66.     return factorization;
  67. }
  68.  
  69. int64_t DivisorsCount(int64_t number) {
  70.     auto factorization = Factorization(number);
  71.     int64_t divisors_count = 1;
  72.     for (auto [_, degree]: factorization) {
  73.         divisors_count *= degree + 1;
  74.     }
  75.     return divisors_count;
  76. }
  77.  
  78. int64_t DivisorsSum(int64_t number) {
  79.     auto factorization = Factorization(number);
  80.     int64_t divisors_sum = 1;
  81.     for (auto [prime, degree]: factorization) {
  82.         divisors_sum *= (Pow(prime, degree + 1, kPrime) - 1) / (prime - 1);
  83.     }
  84.     return divisors_sum;
  85. }
  86.  
  87. int main() {
  88.     int64_t number;
  89.     std::cin >> number;
  90.     std::cout << DivisorsSum(number);
  91.     return 0;
  92. }
  93.  
  94. // p: p + 1
  95. // p^2: p^
  96. // p^n: 1 + ... + p^n: (p^(n + 1) - 1) / (p - 1)
  97. // p_1^q_1 * p_2^q_2 ... p_n^q_n: (p_1^(q_1 + 1) - 1) / (p_1 - 1) * .. * (p_n^(q_n + 1) - 1) / (p_n - 1)
  98.  
  99. // p^(n + 1) - 1 = p^(n + 1) - 1^(n + 1) = (p - 1)(o^n + ... + 1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement