比赛 NOIP模拟赛by mzx Day2 评测结果 AAAAATTTEE
题目名称 学姐的巧克力盒 最终得分 50
用户昵称 FoolMike 运行时间 8.303 s
代码语言 C++ 内存使用 95.66 MiB
提交时间 2016-10-20 21:43:28
显示代码纯文本
#include<cstdio>
#include<cmath>
using namespace std;
const int N=5000010;
typedef long long ll;
int n,m,k,p1,p2,a[N],phi;ll ji[N],Ji[N];
inline int read(){
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-48,ch=getchar();
	return x;
}
inline void getphi(){
	int x=p2;phi=1;
	for (int i=2;i<=sqrt(x);i++)
	if (x%i==0){
		int p=i-1;x/=i;
		while (x%i==0) x/=i,p*=i;
		phi*=p;
	}
	if (x!=1) phi*=(x-1);
}
#define lc x<<1
#define rc (x<<1)|1
void build(int x,int l,int r){
	if (l==r){ji[x]=a[l]%p1;Ji[x]=a[l]%phi;return;}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	ji[x]=ji[lc]*ji[rc]%p1;
	Ji[x]=Ji[lc]*Ji[rc]%phi;
}
int ask1(int x,int l,int r,int L,int R){
	if (l>=L&&r<=R) return ji[x];
	ll ans=1;int mid=(l+r)>>1;
	if (R>mid) ans*=ask1(rc,mid+1,r,L,R);
	if (L<=mid) ans*=ask1(lc,l,mid,L,R);
	return ans%p1;
}
int ask2(int x,int l,int r,int L,int R){
	if (l>=L&&r<=R) return Ji[x];
	ll ans=1;int mid=(l+r)>>1;
	if (R>mid) ans*=ask2(rc,mid+1,r,L,R);
	if (L<=mid) ans*=ask2(lc,l,mid,L,R);
	return ans%phi;
}
inline int mi(ll x,int y){
	ll ans=1;
	while (y){
		if (y&1) ans=(ans*x)%p2;
		x=(x*x)%p2;y>>=1;
	}
	return ans;
}
char s[20];
inline void print(int x){
	if (!x) {puts("0");return;}
	int l=0;for (;x;x/=10) s[l++]=x%10;
	while (l--) putchar(s[l]+'0');
	putchar('\n');
}
int main()
{
	freopen("chocolatebox.in","r",stdin);
	freopen("chocolatebox.out","w",stdout);
	n=read();m=read();k=read();p1=read();p2=read();
	getphi();
	for (int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	while (m--){
		int ty=read(),l=read(),r=read();
		if (ty==2){
			ll ans1=ask2(1,1,n,l,r);
			print(mi(k,ans1));
		}
		else print(ask1(1,1,n,l,r));
	}
	return 0;
}