比赛 NOIP模拟赛by mzx Day2 评测结果 ETETETEEEE
题目名称 学姐的巧克力盒 最终得分 0
用户昵称 Sky_miner 运行时间 7.050 s
代码语言 C++ 内存使用 30.83 MiB
提交时间 2016-10-20 21:13:42
显示代码纯文本
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
	x=0;char ch;bool flag = false;
	while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
	while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 1000010;
int phi(int x){
	int ret = x;
	for(int i=2;i*i<=x; ++i){
		if(x % i == 0){
			ret /= i;ret *= (i-1);
			while(x % i == 0) x /= i;
		}
	}
	if(x^1) ret /= x,ret *= (x-1);
	return ret;
}
int p1,p2,T[maxn<<2],h[maxn<<2],M;
int n,m,k,P;
inline void update(int x){
	T[x] = T[x<<1]*T[x<<1|1]%p1;
	h[x] = h[x<<1]*h[x<<1|1]%p2;
}
void build(int n){
	for(M=1;M<(n+1);M<<=1);
	for(int i=M+1;i<=M+n;++i) read(T[i]),h[i]=T[i],h[i]%=p2,T[i]%=p1;
	for(int i=M-1;i;--i) update(i);
}
int query1(int s,int t){
	int ret = 1;
	for(s += M-1,t += M+1;s^t^1;s>>=1,t>>=1){
		if(~s&1) ret = ret*T[s^1]%p1;
		if( t&1) ret = ret*T[t^1]%p1;
	}return ret;
}
int query2(int s,int t){
	int ret = 1;
	for(s += M-1,t += M+1;s^t^1;s>>=1,t>>=1){
		if(~s&1) ret = ret*h[s^1]%p2;
		if( t&1) ret = ret*h[t^1]%p2;
	}return ret;
}
inline int qpow(int x,int p){
	int ret = 1;
	for(;p;p>>=1,x=x*x%P) if(p&1) ret = ret*x%P;
	return ret;
}
int main(){
	freopen("chocolatebox.in","r",stdin);
	freopen("chocolatebox.out","w",stdout);
	read(n);read(m);read(k);read(p1);read(P);
	p2 = phi(P);
	build(n);
	int cmd,u,v;
	while(m--){
		read(cmd);read(u);read(v);
		if(cmd == 1) printf("%d\n",query1(u,v));
		else printf("%d\n",qpow(k,query2(u,v)) );
	}
	//getchar();getchar();
	fclose(stdin);fclose(stdout);
	return 0;
}