记录编号 326620 评测结果 AAAAAATTTT
题目名称 学姐的巧克力盒 最终得分 60
用户昵称 GravatarRapiz 是否通过 未通过
代码语言 C++ 运行时间 11.312 s
提交时间 2016-10-21 11:13:10 内存使用 58.62 MiB
显示代码纯文本
#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;
int n,m,k,p1,p2,ra[MAXN];
int q1,q2,qt;
struct SEG{
	ll a[MAXN<<2],p;
	ll build(int o,int l,int r){
		if(l==r) return a[o]=ra[l];
		return a[o]=build(lch,l,mid)*build(rch,mid+1,r)%p;
	}
	ll qmult(int o,int l,int r){
		if(q1<=l&&r<=q2) return a[o];
		ll ret=1;
		if(q1<=mid) ret=ret*qmult(lch,l,mid)%p;
		if(q2>=mid+1) ret=ret*qmult(rch,mid+1,r)%p;
		return ret;
	}
	void init(ll ip){
		p=ip;
		build(1,1,n);
	}
}seg[2];
ll qpow(ll f,ll r,ll p){
	ll ret=1;
	f%=p;
	while(r){
		if(r&1) ret=ret*f%p;
		f=f*f%p,r>>=1;
	}
	return ret;
}
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%d%d%d%d%d",&n,&m,&k,&p1,&p2);
	for(int i=1;i<=n;i++) scanf("%d",&ra[i]);
	if(p1) seg[0].init(p1);
	if(p2){
		int phi=p2,t=p2;
		for(int i=2;i*i<=t;i++) if(!(t%i)){
			phi=phi/i*(i-1);
			while(!(t%i)) t/=i;
		}
		if(t>1) phi=phi/t*(t-1);
		seg[1].init(phi);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&qt,&q1,&q2);
		if(qt==1) printf("%lld",seg[0].qmult(1,1,n));
		else {
			printf("%lld",qpow(k,seg[1].qmult(1,1,n),p2));
		}
		printf("\n");
	}
}