记录编号 326401 评测结果 AAAATTTTEE
题目名称 学姐的巧克力盒 最终得分 40
用户昵称 GravatarHzoi_Yniverse 是否通过 未通过
代码语言 C++ 运行时间 9.287 s
提交时间 2016-10-21 07:44:37 内存使用 68.98 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #define lson rt<<1,l,mid
  6. #define rson rt<<1|1,mid+1,r
  7. using namespace std;
  8. const long long maxn=1000010;
  9. long long n,m,k,p1,p2,mm,phi;
  10. long long a[maxn],c[maxn*4],c2[maxn*4];
  11. void Build(long long rt,long long l,long long r){
  12. if(l==r){
  13. c[rt]=a[l]%p1;
  14. if(phi)c2[rt]=a[l]%phi;
  15. return; }
  16. long long mid=(l+r)>>1;
  17. Build(lson); Build(rson);
  18. c[rt]=(c[rt<<1]*c[rt<<1|1])%p1;
  19. if(phi)c2[rt]=(c2[rt<<1]*c2[rt<<1|1])%phi;
  20. }
  21. long long Qery(long long s,long long t,long long rt,long long l,long long r){
  22. //if(s==446)printf("%lld %lld\n",l,r);
  23. if(s<=l&&t>=r) return c[rt];
  24. long long mid=(l+r)>>1;
  25. if(t<=mid) return Qery(s,t,lson);
  26. if(s>mid) return Qery(s,t,rson);
  27. return (Qery(s,t,lson)*Qery(s,t,rson))%p1;
  28. }
  29. long long Qery2(long long s,long long t,long long rt,long long l,long long r){
  30. if(s<=l&&t>=r) return c2[rt];
  31. long long mid=(l+r)>>1;
  32. if(t<=mid) return Qery2(s,t,lson);
  33. if(s>mid) return Qery2(s,t,rson);
  34. return (Qery2(s,t,lson)*Qery2(s,t,rson))%phi;
  35. }
  36. long long Getphi(long long x){
  37. long long ans=x;
  38. for(int i=2;i*i<=x;i++){
  39. if(x%i==0){
  40. while(x%i==0) x/=i;
  41. ans=ans/i*(i-1);
  42. }
  43. }
  44. if(x>1) ans=ans/x*(x-1);
  45. return ans;
  46. }
  47. long long quickpow(long long x,long long m){
  48. long long ans=1;
  49. while(m){
  50. if(m&1) ans*=x;
  51. x*=x; m>>=1;
  52. ans%=p2; x%=p2;
  53. }
  54. return ans%p2;
  55. }
  56. int main(){
  57. freopen("chocolatebox.in","r",stdin);
  58. freopen("chocolatebox.out","w",stdout);
  59. scanf("%lld%lld%lld%lld%lld",&n,&m,&k,&p1,&p2);
  60. for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
  61. phi=Getphi(p2);//printf("phi==%d\n",phi);
  62. Build(1,1,n);
  63. for(int i=1;i<=m;i++){
  64. long long z,x,y;scanf("%lld%lld%lld",&z,&x,&y);
  65. if(z==1) printf("%lld\n",Qery(x,y,1,1,n)%p1);
  66. else{
  67. mm=Qery2(x,y,1,1,n)%phi+phi;
  68. printf("%lld\n",quickpow(k,mm));
  69. }
  70. }
  71. //system("pause");
  72. return 0;
  73. }