比赛 NOIP模拟赛by mzx Day2 评测结果 AWAWAWTTTT
题目名称 学姐的巧克力盒 最终得分 30
用户昵称 Rapiz 运行时间 11.519 s
代码语言 C++ 内存使用 65.14 MiB
提交时间 2016-10-20 21:55:43
显示代码纯文本
#include<cstdio>
#define lch (o<<1)
#define rch ((o<<1)+1)
#define mid ((l+r)>>1)
#define file(x) "chocolatebox."#x
typedef long long ll;
const int MAXN=1e6+10;
ll a[2][MAXN<<2];
int n,m,k,p[2],ra[MAXN];
void build(int o,int l,int r){
	if(l==r) {
		a[0][o]=ra[l]%p[0];
		a[1][o]=ra[l]%p[1];
		return ;
	}
	build(lch,l,mid),build(rch,mid+1,r);
	a[0][o]=a[0][lch]*a[0][rch]%p[0];
	a[1][o]=a[1][lch]*a[1][rch]%p[1];
}
int q1,q2,qt;
ll qmult(int o,int l,int r){
	if(q1<=l&&r<=q2) return a[qt][o];
	ll ret=1;
	if(q1<=mid) ret=ret*qmult(lch,l,mid)%p[qt];
	if(q2>=mid+1) ret=ret*qmult(rch,mid+1,r)%p[qt];
	return ret;
}
ll qpow(ll f,ll r){
	ll ret=1;
	p[1]++;
	f%=p[1];
	while(r){
		if(r&1) ret=ret*f%p[1];
		f=f*f%p[1],r>>=1;
	}
	p[1]--;
	return ret;
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%d%d%d%d%d",&n,&m,&k,&p[0],&p[1]);
	if(!p[0]) p[0]=2;
	if(!p[1]) p[1]=2;
	else p[1]--;
	for(int i=1;i<=n;i++) scanf("%d",&ra[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&qt,&q1,&q2);
		qt--;
		if(qt==0) printf("%lld",qmult(1,1,n));
		else {
			printf("%lld",qpow(k,qmult(1,1,n)));
		}
		printf("\n");
	}
}