Untitled
unknown
plain_text
a year ago
2.7 kB
4
Indexable
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define allam ios_base::sync_with_stdio(false);cin.tie(nullptr); #define all(v) v.begin(),v.end() #define sortv(v) sort(all(v)) using namespace std; typedef long long ll; const int mod = 1e9 + 7; const int N = 1e5 + 5, M = 1e6 + 5, sz = (int) sqrt(N); int f[M]; int spf[M]; int fac[N], inv[N]; int a[N]; int cnt[M]; int ans = 0; struct Query { int l, r, idx; bool operator<(Query other) { return make_pair(this->l / sz, this->r) < make_pair(other.l / sz, other.r); } }; int modPow(int x, int b) { int res = 1; while (b) { if (b & 1)res = 1ll * res * x % mod; b >>= 1, x = 1ll * x * x % mod; } return res; } void init() { fac[0] = 1, inv[1] = 1; for (int i = 1; i < N; ++i) { fac[i] = 1ll * fac[i - 1] * i % mod; inv[i] = modPow(inv[i], mod - 2); } for (int i = 2; i < M; ++i) { if (spf[i])continue; for (int j = i; j < M; j += i) { spf[j] = i; } } for (int i = 1; i < M; ++i) { int temp = i; f[i] = i; while (temp > 1) { int p = spf[temp]; while (temp % p == 0)temp /= p; f[i] = min(f[i], p); } } } void add(int idx) { if(f[a[idx]]==1)return; ans = ans + 2 * cnt[f[a[idx]]] % mod; cnt[f[a[idx]]]++; } void rem(int idx) { if(f[a[idx]]==1)return; cnt[f[a[idx]]]--; ans = ((ans - 2 * cnt[f[a[idx]]]) % mod + mod) % mod; } vector<int> go(vector<Query> q) { int l = q.front().l, r = q.front().l - 1; vector<int> ret(q.size()); for (auto &i: q) { int seg = i.r - i.l + 1; while (l > i.l)add(--l); while (r < i.r)add(++r); while (l < i.l)rem(l++); while (r > i.r)rem(r--); ret[i.idx] = 1ll * ans * modPow(seg, mod - 2)% mod; } return ret; } void solve() { int n, q; cin >> n >> q; for (int i = 0; i < n; ++i) { cin >> a[i]; } vector<Query> query(q); for (int i = 0; i < q; ++i) { cin >> query[i].l >> query[i].r; query[i].l--, query[i].r--, query[i].idx = i; } sort(query.begin(), query.end()); for (auto &i: go(query)) { cout << i << '\n'; } } signed main() { // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); allam init(); int _t = 1; // cin >> _t; while (_t--) { solve(); if (_t) cout << "\n"; } }
Editor is loading...
Leave a Comment