比赛 NOIP模拟赛by mzx Day2 评测结果 AWAAAWTTTT
题目名称 学姐的巧克力盒 最终得分 40
用户昵称 liu_runda 运行时间 10.198 s
代码语言 C++ 内存使用 27.73 MiB
提交时间 2016-10-20 20:38:39
显示代码纯文本
#include<cstdio>
#define lch(x) (x<<1)
#define rch(x) (x<<1|1)
const int maxn=1000005;
int p1,p2,p3;
int phi(int x){
    int ans=x;
    for(int i=2;i*i<=x;++i){
        if(x%i==0){
            ans=ans/x*(x-1);
        }
        while(x%i==0){
            x/=i;
        }
    }
    if(x!=1){
        ans=ans/x*(x-1);
    }
    return ans;
}
int n,m,k;
int sum1[maxn<<2],sum2[maxn<<2];//指数对phi(p2)取模 
void build(int rt,int l,int r){
    if(l==r){
        scanf("%d",&sum1[rt]);
        sum2[rt]=sum1[rt];
        if(p1)sum1[rt]%=p1;
        if(p2)sum2[rt]%=p3;
        return; 
    }
    int mid=(l+r)>>1;
    build(lch(rt),l,mid);
    build(rch(rt),mid+1,r);
    if(p1)sum1[rt]=sum1[lch(rt)]*1LL*sum1[rch(rt)]%p1;
    if(p2)sum2[rt]=sum2[rch(rt)]*1LL*sum2[lch(rt)]%p3; 
}
int ql,qr,qx;
void query1(int rt,int l,int r){
    if(ql<=l&&r<=qr){
        qx=qx*1LL*sum1[rt]%p1;
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid)query1(lch(rt),l,mid);
    if(qr>mid)query1(rch(rt),mid+1,r); 
}
int query1(int l,int r){
    ql=l;qr=r;qx=1;
    query1(1,1,n);
    return qx;
}
void query2(int rt,int l,int r){
    if(ql<=l&&r<=qr){
        qx=qx*1LL*sum2[rt]%p3;
        return;
    }
    int mid=(l+r)>>1;
    if(ql<=mid)query2(lch(rt),l,mid);
    if(qr>mid)query2(rch(rt),mid+1,r); 
}
int query2(int l,int r){
    ql=l;qr=r;qx=1;
    query2(1,1,n);
    return qx;
}
int QuickPow(int a,int x){
    int ans=1;
    for(;x;x>>=1,a=a*1LL*a%p2){
        if(x&1)ans=ans*1LL*a%p2;
    }
    return ans;
}
int main(){
    freopen("chocolatebox.in","r",stdin);
    freopen("chocolatebox.out","w",stdout);
    scanf("%d%d%d%d%d",&n,&m,&k,&p1,&p2);
    if(p2!=0)p3=phi(p2);
    build(1,1,n);
    int typ,l,r;
    while(m--){
        scanf("%d%d%d",&typ,&l,&r);
        if(typ==1){
            printf("%d\n",query1(l,r));
        }else{
            printf("%d\n",QuickPow(k,query2(l,r)));
        }
    }
    fclose(stdin);fclose(stdout);
    return 0;
}