Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define pb emplace_back
- #define fo(i, n) for(int i = 1; i <= n; ++i)
- typedef long long ll;
- const int N = 1000300;
- const int mod = 1e9 + 7;
- int lp[N];
- int l[200200], r[200200];
- int a[200200], n, q;
- int ans[200200];
- int cnt[N];
- int X[N];
- vector<int> e[200200];
- inline void sieve() {
- for(int i = 2; i <= 1000000; ++i) {
- if(!lp[i]) {
- lp[i] = i;
- if(i * 1ll * i <= 1000000)
- for(int j = i * i; j <= 1000000; j += i)
- lp[j] = i;
- }
- }
- }
- vector<pair<int, int> > primes;
- vector<int> divi, pr;
- inline void calc(int p = 0, int x = 1) {
- if(p == primes.size()) {
- divi.pb(x);
- return;
- }
- calc(p + 1, x);
- for(int i = 0; i < primes[p].second; ++i) {
- x *= primes[p].first;
- calc(p + 1, x);
- }
- }
- inline void gen_divisors(int n)
- {
- primes.clear();
- divi.clear();
- while(n > 1)
- {
- int x = lp[n], st = 0;
- while(n % x == 0) n /= x, st++;
- primes.pb(x, st);
- }
- calc();
- }
- int sign, cur_id, s2;
- inline void gen_masks(int p = 0, int x = 1, int c = 0) {
- if(p == pr.size()) {
- if(c) s2 = -1;
- else s2 = 1;
- ans[cur_id] += cnt[x] * s2 * sign;
- return ;
- }
- gen_masks(p + 1, x * pr[p], c ^ 1);
- gen_masks(p + 1, x, c);
- }
- int main() {
- ios::sync_with_stdio(0); cin.tie(0);
- sieve();
- cin >> n;
- fo(i, n) {
- cin >> a[i];
- }
- cin >> q;
- fo(it, q) {
- cin >> l[it] >> r[it] >> X[it];
- e[l[it]-1].pb(-it);
- e[r[it]].pb(it);
- }
- fo(i, n) {
- gen_divisors(a[i]);
- for(int j : divi) cnt[j]++;
- for(int t = 0; t < e[i].size(); ++t) {
- int id = e[i][t], x = X[abs(id)];
- pr.clear();
- while(x > 1) {
- int y = lp[x];
- pr.pb(y);
- while(x % y == 0) x /= y;
- }
- sign = (id < 0 ? -1 : 1), cur_id = abs(id);
- gen_masks();
- }
- }
- fo(it, q) cout << ans[it] << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement