orazma

d.cpp

May 2nd, 2026
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define pb push_back
  5. #define mp make_pair
  6. #define ll long long
  7.  
  8. #define IOS ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  9.  
  10. using namespace std;
  11. const int INF = 1e9 + 1;
  12. const int MOD = 1e9 + 7;
  13. const int MAXN = 1e5 + 10;
  14. ll inv[2000000];
  15. int cnt[MAXN], min_div[MAXN], a[MAXN], ans[MAXN];
  16. pair <pair <int, int>, pair <int, int> > b[MAXN];
  17. ll answer = 1;
  18. ll bin_power(ll x, ll y){
  19.     if (y == 0)
  20.         return 1;
  21.     if (y & 1){
  22.         return x * bin_power(x, y - 1) % MOD;
  23.     }
  24.     else{
  25.         ll z = bin_power(x, y >> 1);
  26.         return (z * z) % MOD;
  27.     }
  28. }
  29.  
  30. void add(int x){
  31.     while (x > 1){
  32.         answer *= inv[cnt[min_div[x]] + 1];
  33.         answer %= MOD;
  34.         cnt[min_div[x]]++;
  35.         answer *= (cnt[min_div[x]] + 1);
  36.         answer %= MOD;
  37.         x /= min_div[x];
  38.     }
  39. }
  40.  
  41. void del(int x){
  42.     while (x > 1){
  43.         answer *= inv[cnt[min_div[x]] + 1];
  44.         answer %= MOD;
  45.         cnt[min_div[x]]--;
  46.         answer *= (cnt[min_div[x]] + 1);
  47.         answer %= MOD;
  48.         x /= min_div[x];
  49.     }
  50. }
  51.  
  52. void solve(){
  53.     for (int i = 2; i <= 10000; i++){
  54.         if (min_div[i] == 0){
  55.             min_div[i] = i;
  56.             for (int j = i * i; j <= 10000; j += i){
  57.                 if (min_div[j] == 0)
  58.                     min_div[j] = i;
  59.             }
  60.         }
  61.     }
  62.  
  63.     for (int i = 0; i < 2000000; i++){
  64.         inv[i] = bin_power(i, MOD - 2);
  65.     }
  66.     int n, q;
  67.     cin >> n >> q;
  68.     for (int i = 1; i <= n; i++){
  69.         cin >> a[i];
  70.     }
  71.     int len = sqrt(n);
  72.     for (int i = 1; i <= q; i++){
  73.         int l, r;
  74.         cin >> l >> r;
  75.         b[i].f.f = l / len;
  76.         b[i].f.s = r;
  77.         b[i].s.f = l;
  78.         b[i].s.s = i;
  79.     }
  80.  
  81.     sort (b + 1, b + q + 1);
  82.     int l = 1;
  83.     int r = 0;
  84.  
  85.     for (int i = 1; i <= q; i++){
  86.         while (r < b[i].f.s){
  87.             r++;
  88.             add(a[r]);
  89.         }
  90.         while (l > b[i].s.f){
  91.             l--;
  92.             add(a[l]);
  93.         }
  94.         while (r > b[i].f.s){
  95.             del(a[r]);
  96.             r--;
  97.         }
  98.         while (l < b[i].s.f){
  99.             del(a[l]);
  100.             l++;
  101.         }
  102.         ans[b[i].s.s] = answer;
  103.     }
  104.  
  105.     for (int i = 1; i <= q; i++){
  106.         cout << ans[i] << '\n';
  107.     }
  108. }
  109.  
  110. int main() {
  111.  
  112.     IOS;
  113.     int t = 1;
  114.     //cin >> t;
  115.     while(t--){
  116.         solve();
  117.     }
  118.     return 0;
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment