主席树re求助
  • 板块CF594D REQ
  • 楼主fhyu
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/28 11:27
  • 上次更新2023/10/28 02:45:17
查看原帖
主席树re求助
465053
fhyu楼主2022/4/28 11:27
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
vector<int>a(200005);
struct segtree{
    int ls,rs,mul;
}sg[15000000];
int si=0;
vector<int>rt(200005),vis(1000005);
void push_up(int root){
    sg[root].mul=1LL*sg[sg[root].ls].mul*sg[sg[root].rs].mul%mod;
}
void build(int &root,int l,int r){
    root=++si;
    if(l==r){
        sg[root].mul=1;
        return;
    }
    int mid=l+r>>1;
    build(sg[root].ls,l,mid);
    build(sg[root].rs,mid+1,r);
    push_up(root);
}
void upd(int &root,int pre,int l,int r,int p,long long x){
    if(p<l||p>r) return;
    root=++si;
    sg[root].ls=sg[pre].ls;
    sg[root].rs=sg[pre].rs;
    sg[root].mul=1LL*sg[pre].mul*x%mod;
    if(l==r){
        return;
    }
    int mid=l+r>>1;
    upd(sg[root].ls,sg[pre].ls,l,mid,p,x);
    upd(sg[root].rs,sg[pre].rs,mid+1,r,p,x);
}
int query(int root,int l,int r,int ql,int qr){
    if(qr<l||ql>r) return 1;
    if(ql<=l&&r<=qr){
        return sg[root].mul;
    }
    int mid=l+r>>1;
    return 1LL*query(sg[root].ls,l,mid,ql,qr)*query(sg[root].rs,mid+1,r,ql,qr)%mod;
}
int fpow(int b,int n){
    int ans=1;
    while(n){
        if(n&1) ans=1LL*ans*b%mod;
        b=1LL*b*b%mod;
        n>>=1;
    }
    return ans;
}
int inv(int x){
    return fpow(x,mod-2);
}
void solve(){
    int n,m;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(rt[0],1,n);
    for(int i=1;i<=n;i++){
        rt[i]=rt[i-1];
        int t=a[i];
        for(int j=2;j<=sqrt(t);j++){
            int cnt=0;
            while(t%j==0){
                t/=j;
                cnt++;
            }
            if(!cnt) continue;
            if(vis[j]){
                upd(rt[i],rt[i],1,n,vis[j],1LL*j*inv(j-1)%mod);
                upd(rt[i],rt[i],1,n,i,1LL*(j-1)*fpow(j,cnt-1)%mod);
            }
            else{
                upd(rt[i],rt[i],1,n,i,1LL*(j-1)*fpow(j,cnt-1)%mod);
            }
            vis[j]=i;
        }
        if(t>1){
            if(vis[t]){
                upd(rt[i],rt[i],1,n,vis[t],1LL*t*inv(t-1)%mod);
                upd(rt[i],rt[i],1,n,i,1LL*(t-1));
            }
            else{
                upd(rt[i],rt[i],1,n,i,1LL*(t-1));
            }
            vis[t]=i;
        }
    }
    cin>>m;
    while(m--){
        int ql,qr;
        cin>>ql>>qr;
        cout<<query(rt[qr],1,n,ql,qr)<<endl;
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T=1;
    while(T--) solve();
    return 0;
}

2022/4/28 11:27
加载中...