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