Advertisement
tuki2501

etf.cpp

Nov 10th, 2021
1,046
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1000000;
  5.  
  6. int sieve[N + 1], res[N + 1], mop[N + 1];
  7.  
  8. int main() {
  9.   cin.tie(0)->sync_with_stdio(0);
  10.   for (int i = 2; i * i <= N; i++) {
  11.     if (sieve[i]) continue;
  12.     for (int j = i * 2; j <= N; j += i) {
  13.       if (!sieve[j]) sieve[j] = i;
  14.     }
  15.   }
  16.   res[1] = 1;
  17.   for (int i = 2; i <= N; i++) {
  18.     if (!sieve[i]) {
  19.       res[i] = i - 1;
  20.       mop[i] = i;
  21.     }
  22.     else if (mop[i / sieve[i]] == sieve[i]) {
  23.       res[i] = i - i / sieve[i];
  24.       mop[i] = sieve[i];
  25.     }
  26.     else {
  27.       int u = i, v = 1;
  28.       while (u % sieve[i] == 0) {
  29.         u /= sieve[i];
  30.         v *= sieve[i];
  31.       }
  32.       res[i] = res[u] * res[v];
  33.       mop[i] = -1;
  34.     }
  35.   }
  36.   int T; cin >> T;
  37.   while (T--) {
  38.     int n; cin >> n;
  39.     cout << res[n] << '\n';
  40.   }
  41. }
  42.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement