记录编号 342361 评测结果 AAAAAAAAAA
题目名称 学姐的巧克力盒 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 5.071 s
提交时间 2016-11-08 13:31:39 内存使用 171.95 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cmath>
  3. using namespace std;
  4. const int N=1000010;
  5. typedef long long ll;
  6. int n,m,k,p1,p2,a[N],phi,ji[22][N],Ji[22][N];
  7. inline int read(){
  8. int x=0;char ch=getchar();
  9. while (ch>'9'||ch<'0') ch=getchar();
  10. while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  11. return x;
  12. }
  13. inline void getphi(){
  14. int x=p2;phi=1;
  15. for (int i=2;i<=sqrt(x);i++)
  16. if (!(x%i)){
  17. int p=i-1;x/=i;
  18. while (!(x%i)) x/=i,p*=i;
  19. phi*=p;
  20. }
  21. if (x!=1) phi*=(x-1);
  22. }
  23. void build1(int l,int r,int h){
  24. if (l==r) return;
  25. int mid=(l+r)>>1;
  26. ji[h][mid]=a[mid]%p1;
  27. for (int i=mid-1;i>=l;i--) ji[h][i]=(ll)ji[h][i+1]*a[i]%p1;
  28. ji[h][mid+1]=a[mid+1]%p1;
  29. for (int i=mid+2;i<=r;i++) ji[h][i]=(ll)ji[h][i-1]*a[i]%p1;
  30. build1(l,mid,h+1);build1(mid+1,r,h+1);
  31. }
  32. void build2(int l,int r,int h){
  33. if (l==r) return;
  34. int mid=(l+r)>>1;
  35. Ji[h][mid]=a[mid]%phi;
  36. for (int i=mid-1;i>=l;i--) Ji[h][i]=(ll)Ji[h][i+1]*a[i]%phi;
  37. Ji[h][mid+1]=a[mid+1]%phi;
  38. for (int i=mid+2;i<=r;i++) Ji[h][i]=(ll)Ji[h][i-1]*a[i]%phi;
  39. build2(l,mid,h+1);build2(mid+1,r,h+1);
  40. }
  41. inline int ask1(int L,int R){
  42. if (L==R) return a[L]%p1;
  43. int l=1,r=n,h=0;
  44. while (1){
  45. int mid=(l+r)>>1;
  46. if (L<=mid&&R>mid) return (ll)ji[h][L]*ji[h][R]%p1;
  47. if (L>mid) l=mid+1;else r=mid;h++;
  48. }
  49. }
  50. inline int ask2(int L,int R){
  51. if (L==R) return a[L]%phi;
  52. int l=1,r=n,h=0;
  53. while (1){
  54. int mid=(l+r)>>1;
  55. if (L<=mid&&R>mid) return (ll)Ji[h][L]*Ji[h][R]%phi;
  56. if (L>mid) l=mid+1;else r=mid;h++;
  57. }
  58. }
  59. inline int mi(int x,int y){
  60. int ans=1;
  61. while (y){
  62. if (y&1) ans=(ll)ans*x%p2;
  63. x=(ll)x*x%p2;y>>=1;
  64. }
  65. return ans;
  66. }
  67. char s[20];
  68. inline void print(int x){
  69. if (!x) {puts("0");return;}
  70. int l=0;for (;x;x/=10) s[l++]=x%10;
  71. while (l--) putchar(s[l]+'0');
  72. putchar('\n');
  73. }
  74. int main()
  75. {
  76. freopen("chocolatebox.in","r",stdin);
  77. freopen("chocolatebox.out","w",stdout);
  78. n=read();m=read();k=read();p1=read();p2=read();
  79. getphi();
  80. for (int i=1;i<=n;i++) a[i]=read();
  81. if (p1) build1(1,n,0);
  82. if (p2) build2(1,n,0);
  83. while (m--){
  84. int ty=read(),l=read(),r=read();
  85. if (ty==2) print(mi(k,ask2(l,r)));
  86. else print(ask1(l,r));
  87. }
  88. return 0;
  89. }