Advertisement
silentkiler029

NT-problem-J

Sep 1st, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MAXN        500000
  5.  
  6. std::vector <int> prime;
  7. bool is_composite[MAXN];
  8.  
  9. void sieve (int n) {
  10.     std::fill (is_composite, is_composite + n, false);
  11.     for (int i = 2; i < n; ++i) {
  12.         if (!is_composite[i]) prime.push_back (i);
  13.         for (int j = 0; j < prime.size () && i * prime[j] < n; ++j) {
  14.             is_composite[i * prime[j]] = true;
  15.             if (i % prime[j] == 0) break;
  16.         }
  17.     }
  18. }
  19.  
  20. long long SOPD(ll x)
  21. {
  22.     ll sod = 1, p;
  23.  
  24.     while(true) {
  25.         for(auto y : prime) {
  26.             if(y > x) break;
  27.             if((x % y) == 0) {
  28.                 p = y;
  29.                 while((x % y) == 0) {
  30.                     x /= y;
  31.                     p *= y;
  32.                 }
  33.                 sod *= (p - 1) / (y - 1);
  34.             }
  35.         }
  36.         if(x == 1) break;
  37.     }
  38.     return (sod);
  39. }
  40.  
  41.  
  42. int main()
  43. {
  44.     int t;
  45.     cin >> t;
  46.     ll n, sopd;
  47.  
  48.     sieve(MAXN);
  49.  
  50.     while(t--) {
  51.         cin >> n;
  52.         sopd = SOPD(n);
  53.         cout << sopd - n << endl;
  54.     }
  55.  
  56.  
  57.     r0;
  58. }
  59.  
  60. //ALHAMDULILLAH
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement