记录编号 342361 评测结果 AAAAAAAAAA
题目名称 学姐的巧克力盒 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 5.071 s
提交时间 2016-11-08 13:31:39 内存使用 171.95 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
using namespace std;
const int N=1000010;
typedef long long ll;
int n,m,k,p1,p2,a[N],phi,ji[22][N],Ji[22][N];
inline int read(){
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+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)){
		int p=i-1;x/=i;
		while (!(x%i)) x/=i,p*=i;
		phi*=p;
	}
	if (x!=1) phi*=(x-1);
}
void build1(int l,int r,int h){
	if (l==r) return;
	int mid=(l+r)>>1;
	ji[h][mid]=a[mid]%p1;
	for (int i=mid-1;i>=l;i--) ji[h][i]=(ll)ji[h][i+1]*a[i]%p1;
	ji[h][mid+1]=a[mid+1]%p1;
	for (int i=mid+2;i<=r;i++) ji[h][i]=(ll)ji[h][i-1]*a[i]%p1;
	build1(l,mid,h+1);build1(mid+1,r,h+1);
}
void build2(int l,int r,int h){
	if (l==r) return;
	int mid=(l+r)>>1;
	Ji[h][mid]=a[mid]%phi;
	for (int i=mid-1;i>=l;i--) Ji[h][i]=(ll)Ji[h][i+1]*a[i]%phi;
	Ji[h][mid+1]=a[mid+1]%phi;
	for (int i=mid+2;i<=r;i++) Ji[h][i]=(ll)Ji[h][i-1]*a[i]%phi;
	build2(l,mid,h+1);build2(mid+1,r,h+1);
}
inline int ask1(int L,int R){
	if (L==R) return a[L]%p1;
	int l=1,r=n,h=0;
	while (1){
		int mid=(l+r)>>1;
		if (L<=mid&&R>mid) return (ll)ji[h][L]*ji[h][R]%p1;
		if (L>mid) l=mid+1;else r=mid;h++;
	}
}
inline int ask2(int L,int R){
	if (L==R) return a[L]%phi;
	int l=1,r=n,h=0;
	while (1){
		int mid=(l+r)>>1;
		if (L<=mid&&R>mid) return (ll)Ji[h][L]*Ji[h][R]%phi;
		if (L>mid) l=mid+1;else r=mid;h++;
	}
}
inline int mi(int x,int y){
	int ans=1;
	while (y){
		if (y&1) ans=(ll)ans*x%p2;
		x=(ll)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();
	if (p1) build1(1,n,0);
	if (p2) build2(1,n,0);
	while (m--){
		int ty=read(),l=read(),r=read();
		if (ty==2) print(mi(k,ask2(l,r)));
			else print(ask1(l,r));
	}
	return 0;
}