Advertisement
Guest User

Untitled

a guest
Oct 24th, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair <int, int> pii;
  7.  
  8. const int MAXN = 200111;
  9. const int MAXA = 1000 * 1000 + 1;
  10.  
  11. int lp[MAXA];
  12. int del[MAXA];
  13.  
  14. void init(){
  15.     vector <int> pr;
  16.     for(int i = 2; i <= MAXA; i++){
  17.         if(lp[i] == 0){
  18.             lp[i] = i;
  19.             pr.emplace_back(i);
  20.         }
  21.  
  22.         for(int j = 0; j < pr.size() && pr[j] <= lp[i] && pr[j] * i <= MAXA; j++)
  23.             lp[i * pr[j]] = pr[j];
  24.     }
  25. }
  26.  
  27. void factorize(int x){
  28.     vector <int> fact;
  29.     while(x != 1){
  30.         int curp = lp[x];
  31.         fact.emplace_back(curp);
  32.         while(x % curp == 0)x /= curp;
  33.     }
  34.     int n = (1 << fact.size());
  35.     vector <int> dp(n);
  36.     dp[0] = 1;
  37.     for(int mask = 1; mask < n; mask++){
  38.         int bit = 31 - __builtin_clz(mask);
  39.         dp[mask] = dp[mask ^ (1 << bit)] * fact[bit];
  40.         del[dp[mask]] += 1;
  41.     }
  42. }
  43.  
  44. int get(int x, int n){
  45.     vector <int> fact;
  46.     while(x != 1){
  47.         int curp = lp[x];
  48.         fact.emplace_back(curp);
  49.         while(x % curp == 0)x /= curp;
  50.     }
  51.     int m = (1 << fact.size());
  52.     vector <int> dp(m);
  53.     dp[0] = 1;
  54.     for(int mask = 1; mask < m; mask++){
  55.         int bit = 31 - __builtin_clz(mask);
  56.         dp[mask] = dp[mask ^ (1 << bit)] * fact[bit];
  57.         if(__builtin_popcount(mask) & 1) n -= del[dp[mask]];
  58.         else n += del[dp[mask]];
  59.     }
  60.     return n;
  61. }
  62.  
  63. int main()
  64. {
  65.     ios_base::sync_with_stdio(0);
  66.     cin.tie(0);
  67.     int n;
  68.     cin >> n;
  69.     vector <int> a(n);
  70.     for(int i = 0; i < n; i++)
  71.         cin >> a[i];
  72.     int m;
  73.     cin >> m;
  74.     init();
  75.     vector < pair <int, pii> > queries(m);
  76.     vector < set <int> > qs(n);
  77.     map < pair <int, int> , int> ans;
  78.     for(int i = 0; i < m; i++){
  79.         int l, r, x;
  80.         cin >> l >> r >> x;
  81.         l--, r--;
  82.         queries[i] = {x, {l, r}};
  83.         if(l > 0)
  84.             qs[l - 1].insert(x);
  85.         qs[r].insert(x);
  86.     }
  87.  
  88.     for(int i = 0; i < n; i++){
  89.         factorize(a[i]);
  90.         for(auto j = qs[i].begin(); j != qs[i].end(); j++)
  91.             ans[{i, *j}] = get(*j, i + 1);
  92.     }
  93.     for(int i = 0; i < m; i++){
  94.         int x = queries[i].first, l = queries[i].second.first, r = queries[i].second.second;
  95.         cout << (l == 0 ? ans[{r, x}] : ans[{r, x}] - ans[{l - 1, x}] ) << '\n';
  96.     }
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement