社区讨论

求莫队卡常

CF594DREQ参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m1yh4kqk
此快照首次捕获于
2024/10/07 11:50
去年
此快照最后确认于
2025/11/04 17:44
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define Rrep(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
typedef long long ll;
const int MAXN=2e5+5,mod=1e9+7,MAXA=1e6+5;
int n,q;
int blk;
struct quy{
    int l,r,id;
    bool operator<(const quy &t)const{
        if(l/blk!=t.l/blk)return l<t.l;
        if((l/blk)&1)return r<t.r;
        return r>t.r;
    }
}md[MAXN];
int ans[MAXN],now=1;
int a[MAXN];
int ksm(int x,int p){
    int res=1;
    while(p){
        if(p&1)res=(1ll*res*x)%mod;
        x=(1ll*x*x)%mod;
        p>>=1;
    }
    return res;
}
int inv(int x){
    return ksm(x,mod-2);
}
int cnt,prm[78498+5],vis[MAXA];
struct node{
    int idx,num;
};
int inv1[78498+5],inv2[78498+1][21],pw[78498+1][21];
vector<node> fj[MAXA];
void sieve(){
    rep(i,2,1e6){
        if(vis[i])continue;
        prm[++cnt]=i;
        for(int j=i;j<=1e6;j+=i){
            vis[j]=1;
            fj[j].push_back((node){cnt,0});
        }
    }
}
int in[78498+5],ck[MAXA];
void add(int ii){
    for(node t:fj[ii]){
        if(in[t.idx]==0)now=(1ll*now*(prm[t.idx]-1)%mod)*pw[t.idx][t.num-1]%mod;
        else now=(1ll*now*pw[t.idx][t.num])%mod;
        in[t.idx]+=t.num;
    }
}
void del(int ii){
    for(node t:fj[ii]){
        if(in[t.idx]==t.num)now=(1ll*now*inv2[t.idx][t.num-1]%mod)*inv1[t.idx]%mod;
        else now=(1ll*now*inv2[t.idx][t.num])%mod;
        in[t.idx]-=t.num;
    }
}
int main(){
    // clock_t st=clock();
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    ios::sync_with_stdio(0);
    cin>>n;
    blk=sqrt(n)+500;
    rep(i,1,n)cin>>a[i];
    sieve();
    rep(i,1,n){
        if(ck[a[i]])continue;
        ck[a[i]]=1;
        for(node &t:fj[a[i]]){
            int x=a[i];
            while(x%prm[t.idx]==0){
                x/=prm[t.idx];
                t.num++;
            }
        }
    }

    rep(i,1,cnt){
        inv1[i]=inv(prm[i]-1);
        ll j=prm[i];
        int tt=inv(prm[i]),xx=1;
        inv2[i][0]=1;
        while(j<=1e6){
            inv2[i][xx]=1ll*inv2[i][xx-1]*tt%mod;
            j*=prm[i];
            xx++;
        }

        j=prm[i];
        pw[i][0]=1;
        xx=1;
        while(j<=1e6){
            pw[i][xx]=1ll*pw[i][xx-1]*prm[i]%mod;
            j*=prm[i];
            xx++;
        }
    }

    cin>>q;
    rep(i,1,q)cin>>md[i].l>>md[i].r,md[i].id=i;
    sort(md+1,md+q+1);
    int L=1,R=0;
    now=1;
    rep(i,1,q){
        int l=md[i].l,r=md[i].r;
        while(L>l)L--,add(a[L]);
        while(R<r)R++,add(a[R]);
        while(L<l)del(a[L]),L++;
        while(R>r)del(a[R]),R--;
        ans[md[i].id]=now;
    }
    rep(i,1,q)cout<<ans[i]<<endl;
    // clock_t ed=clock();
    // cout<<"time: "<<ed-st<<endl;
    return 0;
}

极限数据大概5.2s,无能为力了。

回复

1 条回复,欢迎继续交流。

正在加载回复...