记录编号 |
327106 |
评测结果 |
AAAAAAAAAA |
题目名称 |
学姐的巧克力盒 |
最终得分 |
100 |
用户昵称 |
再见 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
17.777 s |
提交时间 |
2016-10-21 19:51:06 |
内存使用 |
134.81 MiB |
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define lc(o) o<<1
#define rc(o) o<<1|1
const int MAXLEN=52*1024*1024;
char str[MAXLEN+1],*pos=str;
FILE *in=fopen("chocolatebox.in","r"),*out=fopen("chocolatebox.out","w");
inline int read(){
int _x=0;
for(;(*pos)>57||(*pos)<48;pos++);
for(;(*pos)>=48&&(*pos)<=57;_x=(_x<<3)+(_x<<1)+(*pos)-48,pos++);
return _x;
}
char fout[MAXLEN],tem[30];int len,tlen;
inline void print(int x){
tlen=0;
for(x==0?tem[tlen++]='0':0 ; x ; tem[tlen++]=x%10+'0',x/=10);
while(tlen--) fout[len++]=tem[tlen];
fout[len++]='\n';
}
int ans,n,m,phi,k,p1,p2,kp[40],mul[4000010][2];
void build(int o,int l,int r){
if(l==r){
mul[o][0]=read();
if(p1) mul[o][0]%=p1;
if(p2) mul[o][1]=mul[o][0]%phi;
return;
}
int mid=(l+r)>>1,ll=lc(o),rr=rc(o);
build(ll,l,mid);
build(rr,mid+1,r);
if(p1) mul[o][0]=(1ll*mul[ll][0]*mul[rr][0])%p1;
if(p2) mul[o][1]=(1ll*mul[ll][1]*mul[rr][1])%phi;
}
int query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return mul[o][0];
int mid=(l+r)>>1; int re=1;
if(ql<=mid) re=(1ll*re*query(lc(o),l,mid,ql,qr))%p1;
if(mid<qr) re=(1ll*re*query(rc(o),mid+1,r,ql,qr))%p1;
return re;
}
int query2(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return mul[o][1]%phi;
int mid=(l+r)>>1; int re=1;
if(ql<=mid) re=(1ll*re*query2(lc(o),l,mid,ql,qr))%phi;
if(mid<qr) re=(1ll*re*query2(rc(o),mid+1,r,ql,qr))%phi;
return re;
}
int pow2(int b){
int now=1,re=1;
while(b){
if(b&1) re=(1ll*re*kp[now])%p2;
now++; b>>=1;
}
return re;
}
inline void getphi(){
int x=p2,y=sqrt(x);phi=p2;
for(int i=2;i<=y;i++)
if(!(x%i)){
phi=phi-phi/i;
while(!(x%i)) x/=i;
}
if(x>1) phi=phi/x*(x-1);
}
int main()
{
fread(str,1,MAXLEN,in);
n=read(); m=read(); k=read(); p1=read(); p2=read();
if(p2) {kp[1]=k;for(int i=2;i<=32;i++) kp[i]=1ll*kp[i-1]*kp[i-1]%p2;}
if(p2) getphi();
build(1,1,n);
while(m--){
int p=read(),l=read(),r=read();
if(p&1) print(query(1,1,n,l,r));
else print(pow2(query2(1,1,n,l,r)));
}
fwrite(fout,1,len-1,out);
return 0;
}