萌新求调扩展欧拉定理板子过不去样例
查看原帖
萌新求调扩展欧拉定理板子过不去样例
1013955
1234567890sjx楼主2024/8/9 19:48

[Code]

#include<bits/stdc++.h>
#define int long long
using namespace std;
unordered_map<int,int>Phi;
const int N=500100;
int a[N];
int phi(int x){
    if(Phi.count(x))return Phi[x];
    int now=x,qwq=x;
    for(int i=2;i*i<=x;++i)
        if(x%i==0){
            now=now/i*(i-1);
            while(x%i==0)x/=i;
        }
    if(x>1)now=now/x*(x-1);
    return Phi[qwq]=now;
}
inline int awa(int x,int ovo){
    return x<ovo?x:x%ovo+ovo;
}
int ksm(int a,int b,int c){
    int ans=1;
    while(b){
        if(b&1)
            ans=awa(ans*a,c);
        a=awa(a*a,c);
        b>>=1;
    }
    return ans;
}
struct Syx{
    int l,r,sum,YHB;
    void init(int p){
        l=r=p;
        sum=a[p],YHB=0;
    }
    void yhb(int x){
        YHB+=x,sum+=(r-l+1)*x;
    }
}z[N<<2];
Syx operator+(const Syx&l,const Syx&r){
    return {l.l,r.r,l.sum+r.sum,0ll};
}
void build(int l,int r,int rt){
    if(l==r)
        return z[rt].init(l);
    int mid=l+r>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    z[rt]=z[rt<<1]+z[rt<<1|1];
}
void pushyhb(int rt){
    if(z[rt].YHB){
        z[rt<<1].yhb(z[rt].YHB);
        z[rt<<1|1].yhb(z[rt].YHB);
        z[rt].YHB=0;
    }
}
void modify(int l,int r,int rt,int ll,int rr,int v){
    if(ll<=l&&r<=rr)
        return z[rt].yhb(v);
    int mid=l+r>>1;
    pushyhb(rt);
    if(ll<=mid)
        modify(l,mid,rt<<1,ll,rr,v);
    if(mid<rr)
        modify(mid+1,r,rt<<1|1,ll,rr,v);
    z[rt]=z[rt<<1]+z[rt<<1|1];
}
int query(int l,int r,int rt,int ll,int rr){
    if(ll<=l&&r<=rr)
        return z[rt].sum;
    int mid=l+r>>1,s=0;
    pushyhb(rt);
    if(ll<=mid)
        s+=query(l,mid,rt<<1,ll,rr);
    if(mid<rr)
        s+=query(mid+1,r,rt<<1|1,ll,rr);
    return s;
}
int n,m;
int calc(int l,int r,int p){
    if(p==1)return awa(query(1,n,1,l,l),p);
    if(l==r)return awa(query(1,n,1,l,l),p);
    return ksm(query(1,n,1,l,l),calc(l+1,r,phi(p)),p);
}
signed main() {
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        cin>>a[i];
    build(1,n,1);
    while(m--){
        int o;cin>>o;
        if(o==1){
            int l,r,v;
            cin>>l>>r>>v;
            modify(1,n,1,l,r,v);
        }else{
            int l,r,p;
            cin>>l>>r>>p;
            cout<<calc(l,r,p)<<'\n';
        }
    }
    return 0;
} // main
2024/8/9 19:48
加载中...