比赛 |
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;
}