tle 5 维护的是区间所有质数的最大次幂
查看原帖
tle 5 维护的是区间所有质数的最大次幂
661202
Fyindins楼主2023/4/12 15:26
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define endl '\n'
#define x first
#define y second
#define ls u << 1
#define rs u << 1 | 1
//#define int long long
using namespace std;
const int N = 1e5 + 10, lim = 0x3f3f3f3f, mod = 1e9 + 7, M = 2e5 + 10;
using PII = pair<int, int>;
using LL = long long;
struct custom_hash {
  static uint64_t splitmix64(uint64_t x) {
    x += 0x9e3779b97f4a7c15;
    x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
    x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
    return x ^ (x >> 31);
  }

  size_t operator()(uint64_t x) const {
    static const uint64_t FIXED_RANDOM =
        chrono::steady_clock::now().time_since_epoch().count();
    return splitmix64(x + FIXED_RANDOM);
  }
};
struct Node {
  int l, r;
  unordered_map<int, int, custom_hash> p;
} tr[N << 2];

int prime[M], cnt, mind[M];
int a[N], n;
bool st[M];

int qmi(int a, int b) {
  int res = 1;
  while (b) {
    if (b & 1) res = 1ll * res * a % mod;
    a = 1ll * a * a % mod;
    b >>= 1;
  }
  return res;
}

void seive(int n) {
  for (int i = 2; i <= n; i++) {
    if (!st[i]) {
      prime[cnt++] = i;
      mind[i] = i;
    }
    for (int j = 0; j < cnt && prime[j] <= n / i; j++) {
      st[prime[j] * i] = 1;
      mind[prime[j] * i] = prime[j];
      if (i % prime[j] == 0) break;
    }
  }
}

void pushup(Node &u, Node &l, Node &r) {
  set<int> S;
  for (auto &[x, y] : l.p) S.insert(x);
  for (auto &[x, y] : r.p) S.insert(x);
  for (const int &v : S) u.p[v] = max(l.p[v], r.p[v]);
}

void pushup(int u) { pushup(tr[u], tr[ls], tr[rs]); }

void build(int u, int l, int r) {
  tr[u] = {l, r};
  if (l == r) {
    int x = a[l];
    while (x > 1) {
      int t = mind[x];
      int cnt = 0;
      while (x % t == 0) {
        cnt++;
        x /= t;
      }
      tr[u].p[t] = cnt;
    }
    return;
  }
  int mid = l + r >> 1;
  build(ls, l, mid);
  build(rs, mid + 1, r);
  pushup(u);
}

Node query(int u, int l, int r) {
  if (tr[u].l >= l && tr[u].r <= r) return tr[u];
  int mid = tr[u].l + tr[u].r >> 1;
  if (r <= mid) return query(ls, l, r);
  if (l > mid) return query(rs, l, r);
  Node res, left = query(ls, l, r), right = query(rs, l, r);
  pushup(res, left, right);
  return res;
}

void solve() {
  seive(200000);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  build(1, 1, n);
  LL last = 0;
  int q;
  cin >> q;
  while (q--) {
    int l, r;
    cin >> l >> r;
    l = (l + last) % n + 1;
    r = (r + last) % n + 1;
    if (l > r) swap(l, r);
    Node res = query(1, l, r);
    last = 1;
    for (auto &[x, y] : res.p) {
      last = last * qmi(x, y) % mod;
    }
    cout << last << endl;
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int T = 1;
  // cin>>T;
  while (T--) solve();
  return 0;
}
2023/4/12 15:26
加载中...