Advertisement
mfgnik

Untitled

Feb 3rd, 2021
910
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.68 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.  
  88. // (a, b) = (b, a % b)
  89. // (a, 0) = a
  90. // (6, 4) = (4, 6 % 4) = (4, 2) = (2, 4 % 2) = (2, 0) = 2
  91. // (13, 8) = (8, 5) = (5, 3) = (3, 2) = (2, 1) = (1, 0) = 1
  92. // f_n = (...)^n + (...)^n
  93.  
  94. // ax + by = 1
  95. // \exists x_0, y_0 \in Z: ax_0 + bx_0 = 1
  96. // x_0, y_0 называются частным решением
  97.  
  98. // x = x_0 + b * t
  99. // y = y_0 - a * t
  100.  
  101. // ax + by = a (x_0 + b * t) + b (y_0 - a * t) = ax_0 + abt + by_0 - abt = ax_0 + by_0 = 1
  102.  
  103. // 2x + 3y = 1
  104. // -1 1
  105. // 2 -1
  106. // 5 -3
  107. // 8 -5
  108.  
  109. // x = -1 + 3t
  110. // y = 1 - 2t
  111.  
  112. // 2(-1 + 3t) + 3(1 - 2t) = -2 + 6t + 3 - 6t = 3 - 2 = 1
  113.  
  114. // 5x + 7y = 1
  115.  
  116. // x_0 = 10
  117. // y_0 = -7
  118.  
  119. // x = 10 + 7t
  120. // y = -7 -5t
  121.  
  122.  
  123. // 42x + 101y = 1
  124.  
  125. // 101 = 2 * 42 + 17
  126. // 42 = 2 * 17 + 8
  127. // 17 = 2 * 8 + 1
  128.  
  129. // 1 = 17 - 2 * 8 = 17 - 2 * (42 - 2 * 17) = 17 - 2 * 42 + 4 * 17 = 5 * 17 - 2 * 42 =
  130. // 5 * (101 - 2 * 42) - 2 * 42 = 5 * 101 - 12 * 42
  131.  
  132. // x_0 = -12
  133. // y_0 = 5
  134.  
  135.  
  136. // 37x + 79y = 1
  137.  
  138. // 79 = 2 * 37 + 5
  139. // 37 = 7 * 5 + 2
  140. // 5 = 2 * 2 + 1
  141.  
  142. // 1 = 5 - 2 * 2 = 5 - 2 * (37 - 7 * 5) = 5 - 2 * 37 + 14 * 5 = 15 * 5 - 2 * 37 =
  143. // 15 * (79 - 2 * 37) - 2 * 37 = 15 * 79 - 30 * 37 - 2 * 37 = 15 * 79 - 32 * 37
  144.  
  145.  
  146. // 2x + 4y = 1
  147.  
  148. // ax + by = 1 имеет решения титгк (a, b) = 1
  149.  
  150. // 4 = 2 * 2 + 0
  151.  
  152.  
  153. int64_t gcd(int64_t a, int64_t b) {
  154.     if (b == 0) {
  155.         return a;
  156.     }
  157.     return gcd(b, a % b);
  158. }
  159.  
  160.  
  161. int main() {
  162.     int64_t number;
  163.     std::cin >> number;
  164.     std::cout << DivisorsSum(number);
  165.     return 0;
  166. }
  167.  
  168. // p: p + 1
  169. // p^2: p^
  170. // p^n: 1 + ... + p^n: (p^(n + 1) - 1) / (p - 1)
  171. // 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)
  172.  
  173. // 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