Advertisement
Mahmoud_Hawara

Number Theory |

Mar 12th, 2025
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. bool isPrime(int n) // O(n)
  5. {
  6.     if (n == 1) return 0;
  7.     for (int i = 2; i < n; i++)
  8.     {
  9.         if (n % i == 0) return 0;
  10.     }
  11.     return 1;
  12. }
  13.  
  14. bool isPrime_sqrt(int n) // O(sqrt(n))
  15. {
  16.     if (n == 1) return 0;
  17.     for (int i = 2; 1ll * i * i <= n; i++)
  18.     {
  19.         if (n % i == 0) return 0;
  20.     }
  21.     return 1;
  22. }
  23.  
  24. void print_primes_f_1_to_n(int n) // O(n * sqrt(n))
  25. {
  26.     for (int i = 1; i <= n; i++)
  27.     {
  28.         if (isPrime_sqrt(i)) cout << i << ' ';
  29.     }
  30. }
  31.  
  32. vector<bool> prime;
  33. vector<int> ps;
  34.  
  35. void sieve(int n) // O(n)
  36. {
  37.     prime.resize(n + 1, 1);
  38.     prime[0] = prime[1] = 0;
  39.     for (int i = 2; i <= n; i++)
  40.     {
  41.         if (prime[i])
  42.         {
  43.             ps.push_back(i);
  44.             for (int j = i * i; j <= n; j += i)
  45.             {
  46.                 prime[j] = 0;
  47.             }
  48.         }
  49.     }
  50. }
  51.  
  52. void divisores(int n)   // O(n)
  53. {
  54.     for (int i = 1; i <= n; i++)
  55.     {
  56.         if (n % i == 0) cout << i << ' ';
  57.     }
  58. }
  59.  
  60. vector<int> divisores_sqrt(int n)   // O(sqrt(n))
  61. {
  62.     vector<int> dv;
  63.     for (int i = 1; i * i <= n; i++)
  64.     {
  65.         if (n % i == 0)
  66.         {
  67.             dv.push_back(i);
  68.             if (i != n / i) dv.push_back(n / i);
  69.         }
  70.     }
  71.     sort(dv.begin(), dv.end());
  72.     return dv;
  73. }
  74.  
  75. void divisores_f_1_to_n(int n)  // O(n * sqrt(n))
  76. {
  77.     vector<int> dv[n + 1];
  78.     for (int i = 1; i <= n; i++)
  79.     {
  80.         dv[i] = divisores_sqrt(i);
  81.     }
  82.     for (int i = 1; i <= n; i++)
  83.     {
  84.         cout << i << ":\t\t";
  85.         for (auto x : dv[i])
  86.         {
  87.             cout << x << ' ';
  88.         }
  89.         cout << '\n';
  90.     }
  91. }
  92.  
  93. void divisores_f_1_to_n_sieve(int n)    // O(nlogn)
  94. {
  95.     vector<int> dv[n + 1];
  96.     for (int i = 1; i <= n; i++)
  97.     {
  98.         for (int j = i; j <= n; j += i)
  99.         {
  100.             dv[j].push_back(i);
  101.         }
  102.     }
  103.     for (int i = 1; i <= n; i++)
  104.     {
  105.         cout << i << ":\t\t";
  106.         for (auto x : dv[i])
  107.         {
  108.             cout << x << ' ';
  109.         }
  110.         cout << '\n';
  111.     }
  112. }
  113.  
  114. void cnt_divisores_f_1_to_n_sieve(int n)    // O(nlogn)
  115. {
  116.     int cnt_dv[n + 1] {};
  117.     for (int i = 1; i <= n; i++)
  118.     {
  119.         for (int j = i; j <= n; j += i)
  120.         {
  121.             cnt_dv[j]++;
  122.         }
  123.     }
  124.     for (int i = 1; i <= n; i++)
  125.     {
  126.         cout << cnt_dv[i] << ' ';
  127.     }
  128. }
  129.  
  130. void goldbach(int n)    // O(n)
  131. {
  132.     if (n > 2 && n % 2 == 0)
  133.     {
  134.         sieve(n);
  135.         for (auto p : ps)
  136.         {
  137.             if (prime[n - p])
  138.             {
  139.                 cout << p << ' ' << n - p << '\n';
  140.                 return;
  141.             }
  142.         }
  143.     }
  144.     else
  145.     {
  146.         cout << "Error\n";
  147.     }
  148. }
  149.  
  150. vector<pair<int, int>> factorization(int n) // O(sqrt(n))
  151. {
  152.     vector<pair<int, int>> pf;
  153.     for (int i = 2; i * i <= n; i++)
  154.     {
  155.         int e = 0;
  156.         while (n % i == 0)
  157.         {
  158.             n /= i;
  159.             e++;
  160.         }
  161.         if (e) pf.push_back({i, e});
  162.     }
  163.     if (n != 1) pf.push_back({n, 1});
  164.     return pf;
  165. }
  166.  
  167. int cnt_div_factorization(vector<pair<int, int>> pf)    // O(logn)
  168. {
  169.     int res = 1;
  170.     for (auto [x, y] : pf)
  171.     {
  172.         res *= (y + 1);
  173.     }
  174.     return res;
  175. }
  176.  
  177. vector<int> lpf;
  178.  
  179. void get_lpf(int n) // O(n)
  180. {
  181.     lpf.resize(n + 1, 0);
  182.     for (int i = 2; i <= n; i++)
  183.     {
  184.         if (lpf[i] == 0)
  185.         {
  186.             for (int j = i; j <= n; j += i)
  187.             {
  188.                 if (lpf[j] == 0) lpf[j] = i;
  189.             }
  190.         }
  191.     }
  192. }
  193.  
  194. vector<int> factorization_lpf(int n) // O(log n)
  195. {
  196.     vector<int> pf;
  197.     while (n != 1)
  198.     {
  199.         pf.push_back(lpf[n]);
  200.         n /= lpf[n];
  201.     }
  202.     return pf;
  203. }
  204.  
  205. vector<int> dv;
  206.  
  207. void generate_dv(int i, vector<pair<int, int>> &pf, int dvv = 1)
  208. {
  209.     if (i == pf.size())
  210.     {
  211.         dv.push_back(dvv);
  212.         return;
  213.     }
  214.     generate_dv(i + 1, pf, dvv);
  215.     for (int j = 0; j < pf[i].second; j++)
  216.     {
  217.         dvv *= pf[i].first;
  218.         generate_dv(i + 1, pf, dvv);
  219.     }
  220. }
  221.  
  222. int main() {
  223.    
  224.     int n;
  225.     cin >> n;
  226.     auto pf = factorization(n);
  227.     generate_dv(0, pf);
  228.     sort(dv.begin(), dv.end());
  229.     for (auto x : dv)
  230.     {
  231.         cout << x << ' ';
  232.     }
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement