Advertisement
Guest User

1497.cpp

a guest
Jun 9th, 2018
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. #define pb emplace_back
  7. #define fo(i, n) for(int i = 1; i <= n; ++i)
  8.  
  9. typedef long long ll;
  10.  
  11. const int N = 1000300;
  12. const int mod = 1e9 + 7;
  13.  
  14. int lp[N];
  15. int l[200200], r[200200];
  16. int a[200200], n, q;
  17. int ans[200200];
  18. int cnt[N];
  19. int X[N];
  20. vector<int> e[200200];
  21.  
  22. inline void sieve() {
  23.     for(int i = 2; i <= 1000000; ++i) {
  24.         if(!lp[i]) {
  25.             lp[i] = i;
  26.             if(i * 1ll * i <= 1000000)
  27.                 for(int j = i * i; j <= 1000000; j += i)
  28.                     lp[j] = i;
  29.         }
  30.     }
  31. }
  32. vector<pair<int, int> > primes;
  33. vector<int> divi, pr;
  34.  
  35. inline void calc(int p = 0, int x = 1) {
  36.     if(p == primes.size()) {
  37.         divi.pb(x);
  38.         return;
  39.     }
  40.     calc(p + 1, x);
  41.     for(int i = 0; i < primes[p].second; ++i) {
  42.         x *= primes[p].first;
  43.         calc(p + 1, x);
  44.     }
  45. }
  46.  
  47. inline void gen_divisors(int n)
  48. {
  49.     primes.clear();
  50.     divi.clear();
  51.     while(n > 1)
  52.     {
  53.         int x = lp[n], st = 0;
  54.         while(n % x == 0) n /= x, st++;
  55.         primes.pb(x, st);
  56.     }
  57.     calc();
  58. }
  59.  
  60. int sign, cur_id, s2;
  61.  
  62. inline void gen_masks(int p = 0, int x = 1, int c = 0) {
  63.     if(p == pr.size()) {
  64.         if(c) s2 = -1;
  65.         else s2 = 1;
  66.         ans[cur_id] += cnt[x] * s2 * sign;
  67.         return ;
  68.     }
  69.     gen_masks(p + 1, x * pr[p], c ^ 1);
  70.     gen_masks(p + 1, x, c);
  71. }
  72.  
  73. int main() {
  74.     //ios::sync_with_stdio(0); cin.tie(0);
  75.     sieve();
  76.     scanf("%d", &n);
  77.     //cin >> n;
  78.     fo(i, n) {
  79.         scanf("%d", &a[i]);
  80.         //cin >> a[i];
  81.     }
  82.     scanf("%d", &q);
  83.     //cin >> q;
  84.     fo(it, q) {
  85.         scanf("%d %d %d", &l[it], &r[it], &X[it]);
  86.         //cin >> l[it] >> r[it] >> X[it];
  87.         e[l[it]-1].pb(-it);
  88.         e[r[it]].pb(it);
  89.     }
  90.     fo(i, n) {
  91.         gen_divisors(a[i]);
  92.         for(int j : divi) cnt[j]++;
  93.         for(int t = 0; t < e[i].size(); ++t) {
  94.             int id = e[i][t], x = X[abs(id)];
  95.             pr.clear();
  96.             while(x > 1) {
  97.                 int y = lp[x];
  98.                 pr.pb(y);
  99.                 while(x % y == 0) x /= y;
  100.             }
  101.             sign = (id < 0 ? -1 : 1), cur_id = abs(id);
  102.             gen_masks();
  103.         }
  104.     }
  105.     fo(it, q) {
  106.         printf("%d\n", ans[it]);
  107.         //cout << ans[it] << '\n';
  108.     }
  109.          
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement