比赛 |
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;
}