Dang_Quan_10_Tin

PRIMELCM

Aug 29th, 2020 (edited)
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cmath>
  5. #include <bitset>
  6. #include <algorithm>
  7. #define task "PRIMELCM"
  8. using namespace std;
  9. using ll = long long;
  10. using ld = long double;
  11.  
  12. const int N = 1e7 + 1;
  13. const int M = 1e5 + 2;
  14. ll v[M], maxn, ans[M], st[M * 4];
  15. int n, id[M];
  16. bitset<N> ck;
  17. vector<int> pr;
  18. const ll mod = 998244353;
  19.  
  20. ll Pow(ll a, ll b)
  21. {
  22.     ll tmp = 1;
  23.     for (; b > 0; b >>= 1)
  24.     {
  25.         if (b & 1)
  26.             tmp = tmp * a % mod;
  27.         a = a * a % mod;
  28.     }
  29.     return tmp;
  30. }
  31.  
  32. void Read()
  33. {
  34.     cin >> n;
  35.     for (int i = 1; i <= n; ++i)
  36.     {
  37.         cin >> v[i];
  38.         id[i] = i;
  39.         maxn = max(maxn, (ll)sqrt((ld)v[i]));
  40.     }
  41.     for (int i = 2; i * i <= maxn; ++i)
  42.         if (!ck[i])
  43.             for (int j = i * i; j <= maxn; j += i)
  44.                 ck[j] = 1;
  45.     for (int i = 2; i <= maxn; ++i)
  46.         if (!ck[i])
  47.             pr.push_back(i);
  48. }
  49.  
  50. ll Cal(ll v)
  51. {
  52.     ll ans = 1;
  53.     for (auto i : pr)
  54.     {
  55.         ll n = v;
  56.         if (n < (ll)i * i)
  57.             break;
  58.         int cnt = 0;
  59.         while (n >= i)
  60.         {
  61.             n /= i;
  62.             ++cnt;
  63.         }
  64.         if (cnt)
  65.             ans = ans * Pow(i, cnt - 1) % mod;
  66.     }
  67.     return ans;
  68. }
  69.  
  70. /* loga(b) = log2(b) / log2(a) */
  71.  
  72. int loga(ll n, int k)
  73. {
  74.     return log2((ld)n) / log2((ld)k);
  75. }
  76.  
  77. void Push(int id)
  78. {
  79.     st[id << 1] = st[id << 1] * st[id] % mod;
  80.     st[id << 1 | 1] = st[id << 1 | 1] * st[id] % mod;
  81.     st[id] = 1;
  82. }
  83.  
  84. void upd(int id, int l, int r, int &a, int &b, int &v)
  85. {
  86.     if (l > b || r < a)
  87.         return;
  88.     if (l >= a && r <= b)
  89.     {
  90.         st[id] = st[id] * v % mod;
  91.         return;
  92.     }
  93.     Push(id);
  94.     upd(id << 1, l, (l + r) / 2, a, b, v);
  95.     upd(id << 1 | 1, (l + r) / 2 + 1, r, a, b, v);
  96. }
  97.  
  98. ll Get(int id, int l, int r, int pos)
  99. {
  100.     if (l == r && r == pos)
  101.         return st[id];
  102.     Push(id);
  103.     if ((l + r) / 2 >= pos)
  104.         return Get(id << 1, l, (l + r) / 2, pos);
  105.     return Get(id << 1 | 1, (l + r) / 2 + 1, r, pos);
  106. }
  107.  
  108. void Solve()
  109. {
  110.     fill_n(st, M * 4, 1);
  111.     sort(id + 1, id + n + 1, [&](int &x, int &y) {
  112.         return v[x] < v[y];
  113.     });
  114.     for (auto i : pr)
  115.     {
  116.         ll cur = i;
  117.         int tmp = loga(v[id[n]], i);
  118.         for (int j = 2; j <= tmp; ++j)
  119.         {
  120.             cur = cur * i;
  121.             int l = 1, m, h = n;
  122.             while (l <= h)
  123.             {
  124.                 m = (l + h) / 2;
  125.                 if (v[id[m]] < cur)
  126.                     l = m + 1;
  127.                 else
  128.                     h = m - 1;
  129.             }
  130.             upd(1, 1, n, l, n, i);
  131.         }
  132.     }
  133.     for (int i = 1; i <= n; ++i)
  134.         ans[id[i]] = Get(1, 1, n, i);
  135.     for (int i = 1; i <= n; ++i)
  136.         cout << ans[i] << " ";
  137. }
  138.  
  139. int32_t main()
  140. {
  141.     ios::sync_with_stdio(0);
  142.     cin.tie(0);
  143.     cout.tie(0);
  144.     if (fopen(task ".INP", "r"))
  145.         freopen(task ".INP", "r", stdin),
  146.             freopen(task ".OUT", "w", stdout);
  147.     Read();
  148.     Solve();
  149. }
Add Comment
Please, Sign In to add comment