记录编号 |
342361 |
评测结果 |
AAAAAAAAAA |
题目名称 |
学姐的巧克力盒 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
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;
- }