比赛 NOIP模拟赛by mzx Day2 评测结果 WWWWTTTTEE
题目名称 学姐的巧克力盒 最终得分 0
用户昵称 ciyou 运行时间 9.099 s
代码语言 C++ 内存使用 14.01 MiB
提交时间 2016-10-20 21:50:16
显示代码纯文本
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int sigtree[4000006];
int N,M,K,P1,P2;
int ask(int,int,int,int,int);
int ask_again(int,int,int,int,int);
int PowerMod(int a, int b, int c){
	int ans = 1;
	a = a % c;
	while(b>0){
		if(b%2==1)
			ans=(ans*a)%c;
		b=b/2;
		a=(a*a)%c;
	}
	return ans;
}
int main(){
	freopen("chocolatebox.in","r",stdin);
	freopen("chocolatebox.out","w",stdout);
	cin>>N>>M>>K>>P1>>P2;
	int k=1;
	while((1<<k)<N) k++;
	int MAXN=1<<k;
	for(int i=1;i<=N;i++){
		int t;
		cin>>t;
		sigtree[MAXN+i-1]=t%P1;
	}
	if(N<MAXN) for(int i=MAXN+N;i<=MAXN*2-1;i++) sigtree[i]=1;
	k=(MAXN/2);
	while(k>0){
		for(int i=k;i<(k*2);i++){
			ll temp;
			temp=(sigtree[i<<1]*sigtree[(i<<1)|1])%P1;
			sigtree[i]=temp;
		}
		k=(k/2);
	}
	for(int i=1;i<=M;i++){
		int ty,l,r;
		cin>>ty>>l>>r;
		if(ty==1) cout<<ask(l,r,1,MAXN,1)<<endl;
		if(ty==2) cout<<PowerMod(K,ask_again(l,r,1,MAXN,1),P2);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}
int ask(int l,int r,int a,int b,int k){
	int m=(a+b)/2;
	if(l==a&&r==b) {
		return sigtree[k];
	}
	if(m>=r) return ask(l,r,a,m,k<<1);
	if(m+1<=l) return ask(l,r,m+1,b,k<<1|1);
	
	ll temp=(ask(l,m,a,m,k<<1)*ask(m+1,r,m+1,b,k<<1|1))%P1;
	int ans=temp;
	return ans;
}
int ask_again(int l,int r,int a,int b,int k){
	int m=(a+b)/2;
	if(l==a&&r==b) {
		return sigtree[k];
	}
	if(m>=r) return ask(l,r,a,m,k<<1);
	if(m+1<=l) return ask(l,r,m+1,b,k<<1|1);
	
	ll temp=(ask(l,m,a,m,k<<1)*ask(m+1,r,m+1,b,k<<1|1))%P2;
	int ans=temp;
	return ans;
}