C++ 95 分WA#3 求助!!!
查看原帖
C++ 95 分WA#3 求助!!!
1048193
PengDave楼主2024/8/14 15:44
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<bitset>
using namespace std;
typedef long long ll;
ll n,m,p,c;
inline void readl(ll &x){
    x=0;
    char ch=getchar();
    while(!isdigit(ch)){
        ch=getchar();
    }
    while(isdigit(ch)){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return;
}
inline ll calc_phi(ll n){
    ll ans=n;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            ans=ans/i*(i-1);
            while(n%i==0){
                n/=i;
            }
        }
    }
    if(n>1){
        ans=ans/n*(n-1);
    }
    return ans;
}
ll phi[100];
int maxt=0;
ll qpow[100][10010][2],pf[100][10010][2];
inline void Init(){
    phi[0]=p;
    while(phi[maxt]>1){
        maxt++;
        phi[maxt]=calc_phi(phi[maxt-1]);
    }
    phi[++maxt]=1;
    for(int i=0;i<=maxt;i++){
        qpow[i][0][0]=1;
        if(phi[i]==1){
            pf[i][0][0]=1;
            qpow[i][0][0]=0;
        }
        for(int j=1;j<=10000;j++){
            qpow[i][j][0]=qpow[i][j-1][0]*c;
            if(qpow[i][j][0]>=phi[i]){
                qpow[i][j][0]%=phi[i];
                pf[i][j][0]=1;
            }
            pf[i][j][0]|=pf[i][j-1][0];
        }
    }
    for(int i=0;i<=maxt;i++){
        qpow[i][0][1]=1;
        if(phi[i]==1){
            pf[i][0][1]=1;
            qpow[i][0][1]=0;
        }
        pf[i][1][1]=pf[i][10000][0];
        for(int j=1;j<=10000;j++){
            qpow[i][j][1]=qpow[i][j-1][1]*qpow[i][10000][0];
            if(qpow[i][j][1]>=phi[i]){
                qpow[i][j][1]%=phi[i];
                pf[i][j][1]=1;
            }
            pf[i][j][1]|=pf[i][j-1][1];
        }
    }
    return;
}
bool flag;
inline ll ksm(ll b,ll p){
    flag=0;
    ll res=qpow[p][b%10000][0]*qpow[p][b/10000][1];
    if(res>=phi[p]||pf[p][b%10000]||pf[p][b/10000]){
        res%=phi[p];
        flag=1;
    }
    return res;
}
ll dfs(ll k,int dep,int mdep){
    flag=0;
    if(dep==mdep){
        if(k>=phi[dep]){
            k%=phi[dep];
            flag=1;
        }
        return k;
    }
    ll t=dfs(k,dep+1,mdep);
    return ksm(flag?t+phi[dep+1]:t,dep);
}
ll a[50010];
struct node{
    ll val;
    int mint;
    node(){
        val=0;
        mint=0;
    }
}tree[50010<<2];
inline void pushup(int u){
    tree[u].val=tree[u<<1].val+tree[u<<1|1].val;
    if(tree[u].val>=p){
        tree[u].val-=p;
    }
    tree[u].mint=min(tree[u<<1].mint,tree[u<<1|1].mint);
    return;
}
void build(int l,int r,int u){
    if(l==r){
        tree[u].val=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,u<<1);
    build(mid+1,r,u<<1|1);
    pushup(u);
    return;
}
void update(int l,int r,int L,int R,int u){
    if(tree[u].mint>=maxt){
        return;
    }
    if(L==R){
        tree[u].mint++;
        tree[u].val=dfs(a[L],0,tree[u].mint);
        return;
    }
    int mid=(L+R)>>1;
    if(l<=mid&&tree[u<<1].mint<maxt){
        update(l,r,L,mid,u<<1);
    }
    if(mid<r&&tree[u<<1|1].mint<maxt){
        update(l,r,mid+1,R,u<<1|1);
    }
    pushup(u);
    return;
}
ll query(int l,int r,int L,int R,int u){
    if(l<=L&&R<=r){
        return tree[u].val;
    }
    int mid=(L+R)>>1;
    ll ans=0;
    if(l<=mid){
        ans+=query(l,r,L,mid,u<<1);
    }
    if(mid<r){
        ans+=query(l,r,mid+1,R,u<<1|1);
    }
    if(ans>=p){
        ans-=p;
    }
    return ans;
}
int main(){
    readl(n);readl(m);readl(p);readl(c);
    Init();
    for(int i=1;i<=n;i++){
        readl(a[i]);
    }
    build(1,n,1);
    while(m--){
        ll op,l,r;
        readl(op);
        readl(l);
        readl(r);
        if(op==0){
            update(l,r,1,n,1);
        }else{
            cout<<query(l,r,1,n,1)<<endl;
        }
    }
    return 0;
}
2024/8/14 15:44
加载中...