【BZOJ4869】相逢是问候(线段树,欧拉定理)

题面

BZOJ

题解

根据欧拉定理递归计算(类似上帝与集合的正确用法)

所以我们可以用线段树维护区间最少的被更新的多少次

如果超过了\(\varphi\)的限制

就不用再计算了

如果需要计算就每次暴力算

这样的复杂度\(O(nlog^2)\)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define lson (now<<1)
  13. #define rson (now<<1|1)
  14. #define MAX 80000
  15. #define ll long long
  16. inline int read()
  17. {
  18. int x=0,t=1;char ch=getchar();
  19. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  20. if(ch=='-')t=-1,ch=getchar();
  21. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  22. return x*t;
  23. }
  24. int a[MAX],C,P,n,m;
  25. ll phi[MAX],tot;
  26. ll Phi(ll x)
  27. {
  28. ll ret=x;
  29. for(ll i=2;i*i<=x;++i)
  30. if(x%i==0)
  31. {
  32. ret=ret/i*(i-1);
  33. while(x%i==0)x/=i;
  34. }
  35. if(x>1)ret=ret/x*(x-1);
  36. return ret;
  37. }
  38. ll fpow(ll a,ll b,ll P)
  39. {
  40. long long s=1;
  41. bool fl=false,f2=false;
  42. while(b)
  43. {
  44. if(b&1)s=1ll*s*a,fl|=f2;
  45. if(s>=P)fl=true,s%=P;
  46. a=a*a;
  47. if(a>=P)f2=true,a%=P;
  48. b>>=1;
  49. }
  50. if(fl)s+=P;
  51. return s;
  52. }
  53. struct Node{long long sum;int tt;}t[MAX<<2];
  54. inline void Build(int now,int l,int r)
  55. {
  56. if(l==r){t[now].sum=a[l]=read();return;}
  57. int mid=(l+r)>>1;
  58. Build(lson,l,mid);Build(rson,mid+1,r);
  59. t[now].sum=(t[lson].sum+t[rson].sum)%P;
  60. }
  61. ll Calc(int l,int r,ll x,ll P)
  62. {
  63. if(l==r)return fpow(x,1,P);
  64. return fpow(C,Calc(l+1,r,x,phi[l+1]),P);
  65. }
  66. void Modify(int now,int l,int r,int L,int R)
  67. {
  68. if(t[now].tt>=tot)return;
  69. if(l==r)
  70. {
  71. t[now].sum=Calc(0,++t[now].tt,a[l],P)%P;
  72. //t[now].sum=fpow(C,a[l],P)%P;
  73. //a[l]=fpow(C,a[l],phi[1]);
  74. return;
  75. }
  76. int mid=(l+r)>>1;
  77. if(L<=mid)Modify(lson,l,mid,L,R);
  78. if(R>mid)Modify(rson,mid+1,r,L,R);
  79. t[now].tt=min(t[lson].tt,t[rson].tt);
  80. t[now].sum=(t[lson].sum+t[rson].sum)%P;
  81. }
  82. int Query(int now,int l,int r,int L,int R)
  83. {
  84. if(L<=l&&r<=R)return t[now].sum;
  85. int mid=(l+r)>>1;ll ret=0;
  86. if(L<=mid)ret=(ret+Query(lson,l,mid,L,R))%P;
  87. if(R>mid)ret=(ret+Query(rson,mid+1,r,L,R))%P;
  88. return ret;
  89. }
  90. int main()
  91. {
  92. n=read();m=read();P=read();C=read();
  93. Build(1,1,n);
  94. phi[0]=P;
  95. for(tot=1;;++tot)
  96. {
  97. phi[tot]=Phi(phi[tot-1]);
  98. if(phi[tot]==1)break;
  99. }
  100. phi[++tot]=1;
  101. while(m--)
  102. {
  103. int opt=read(),l=read(),r=read();
  104. if(opt)printf("%d\n",Query(1,1,n,l,r));
  105. else Modify(1,1,n,l,r);
  106. }
  107. return 0;
  108. }

【BZOJ4869】相逢是问候(线段树,欧拉定理)的更多相关文章

  1. 【BZOJ4869】相逢是问候 [线段树][欧拉定理]

    相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Informatikverbin ...

  2. [BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)

    4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1313  Solved: 471[Submit][Stat ...

  3. 【bzoj4869】[Shoi2017]相逢是问候 线段树+扩展欧拉定理

    Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两 ...

  4. BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】

    题目链接 BZOJ4869 题解 这题调得我怀疑人生,,结果就是因为某些地方\(sb\)地忘了取模 前置题目:BZOJ3884 扩展欧拉定理: \[c^a \equiv c^{a \mod \varp ...

  5. SHOI 2017 相逢是问候(扩展欧拉定理+线段树)

    题意 https://loj.ac/problem/2142 思路 一个数如果要作为指数,那么它不能直接对模数取模,这是常识: 诸如 \(c^{c^{c^{c..}}}\) 的函数递增飞快,不是高精度 ...

  6. 洛谷P3747 [六省联考2017]相逢是问候

    传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...

  7. bzoj 4869: [Shoi2017]相逢是问候 [扩展欧拉定理 线段树]

    4869: [Shoi2017]相逢是问候 题意:一个序列,支持区间\(a_i \leftarrow c^{a_i}\),区间求和.在模p意义下. 类似于开根操作,每次取phi在log次后就不变了. ...

  8. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

  9. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)

    这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...

随机推荐

  1. java线程池技术(一):ThreadFactory与BlockingQueue

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.ThreadFactory概述以及源码分析 ThreadFactory很简单,就是一个线程工厂也就是负责生产线程的,我们看下ThreadFact ...

  2. dedecms文章页调用上一篇和下一篇文章

    dedecms文章页调用上一篇和下一篇文章,解析后是链接形式的上下篇 {dede:prenext get='pre'/} {dede:prenext get='next'/}

  3. 使用腾讯云“自定义监控”监控GPU使用率

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:李想 随着人工智能以及比特币的火热,GPU云服务的使用场景是越来越广,在很多场景下我们也需要获取GPU服务器的性能参数来优化程序的执行.目 ...

  4. NDK配置debug环境时:Error:FAILURE: Build failed with an exception

    Error:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:ex ...

  5. 基于Ado.Net的日志组件

    软件开发,离不开对日志的操作,它可以帮助我们查找和检测问题.好的日志组件可以对于整个系统来说,至关重要 在NaviSoft产品中,日志组件也占有非常重要的份量.如下图所示,是组件的Db表结构设计 图- ...

  6. 高性能javascript笔记

    ----------------------------------------------------------- 第一章 加载和执行 ------------------------------ ...

  7. Yii2框架ACF(AccessControl Filter)的使用

    AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述. ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控 ...

  8. CentOS命令修改系统时间同步

    使用Centos,遇到本地时间对不上,直接敲命令:date -s "2016-01-08  15:15:15"是立即生效了,但是重启后,系统时间还是原来的. 修改了其一是没有办法奏 ...

  9. FreeImage库如何转换图片格式?

    FreeImage下载地址:http://freeimage.sourceforge.net/ //freeimagemain.h #ifndef FREEIMAGEMAIN_H #define FR ...

  10. CodeForces-747E

    这几天好懒,昨天写的题,今天才来写博客.... 这题你不知道它究竟有多少层,但是知道字符串长度不超过10^6,那么它的总容量是被限定的,用一个二维动态数组就OK了.输入字符串后,可以把它按照逗号分割成 ...