4869: [Shoi2017]相逢是问候
Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1205 Solved: 409
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 4
0 1 4
1 2 4
0 1 4
1 1 3
Sample Output
3
HINT
鸣谢多名网友提供正确数据,已重测!
Source
#include<bits/stdc++.h> #define ll long long #define maxn 50005 using namespace std; int P[30],n,m,a[maxn]; int f[maxn],len,C,opt,TP; int le,ri,tim[maxn],val[maxn]; set<int> s; //set<int> ::iterator it; inline int add(int x,int y,const int ha){ x+=y; return x>=ha?x-ha:x; } inline int mod(int x,int y,const int ha){ ll P=x*(ll)y; return P>=ha?P%ha+ha:P; } inline int phi(int x){ int y=1; for(int i=2;i*(ll)i<=x;i++) if(!(x%i)){ y*=(i-1),x/=i; while(!(x%i)) x/=i,y*=i; if(x==1) break; } if(x!=1) return y*(x-1); else return y; } inline void update(int x,int y){ for(;x<=n;x+=x&-x) f[x]=add(f[x],y,P[0]); } inline int query(int x){ int an=0; for(;x;x-=x&-x) an=add(an,f[x],P[0]); return an; } inline int ksm(int x,int y,const int ha){ int an=1; for(;y;y>>=1,x=mod(x,x,ha)) if(y&1) an=mod(an,x,ha); return an; } /* int get(int sit,int pos){ if(sit==TP) return a[pos]>=P[sit]?a[pos]%P[sit]+P[sit]:a[pos]; else return ksm(C,get(sit+1,pos),P[sit]); } */ inline void TOL(){ int now=*s.lower_bound(le); for(;now<=ri;now=*s.upper_bound(now)){ update(now,P[0]-val[now]); tim[now]++,TP=tim[now]; if(tim[now]>len) val[now]=1; else val[now]=(a[now]>=P[TP]?a[now]%P[TP]+P[TP]:a[now]); for(int i=TP-1;i>=0;i--){ val[now]=ksm(C,val[now],P[i]); } val[now]%=P[0]; update(now,val[now]); if(tim[now]==len+1) s.erase(now); } } int main(){ // freopen("9.in","r",stdin); // freopen("9.out","w",stdout); scanf("%d%d%d%d",&n,&m,P,&C); for(len=1;;len++){ P[len]=phi(P[len-1]); if(P[len]==1) break; } s.insert(0),s.insert(n+1); for(int i=1;i<=n;i++){ scanf("%d",a+i); update(i,a[i]); s.insert(i); val[i]=a[i]; } while(m--){ scanf("%d%d%d",&opt,&le,&ri); if(opt) printf("%d\n",add(query(ri),P[0]-query(le-1),P[0])); else TOL(); } return 0; }