Ynoi2016 炸脖龙重题了。

BZOJ 5394。

首先是扩展欧拉定理:

一开始傻掉了……递归的层数和区间长度无关……也就是说我们每一次直接暴力递归求解子问题一定不会超过$logP$层,因为当模数变成$1$了的时候,不管怎么乘方都不会再变化了。

然后要注意$b < \phi (P)$的情况,在快速幂的时候判断一下,如果超过了$\phi (P)$,那么就再加上一个$P$。

对于区间修改,树状数组或者线段树均可,每一层直接查询。

一共有不超过$logP$层,每一层有$logn$的开销查询元素,所以最后的复杂度是$O(Maxn + qlogP * logn)$。

另外,BZOJ上要把$pri$开成一半才不会爆空间……

Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. typedef long long ll;
  5.  
  6. const int N = 5e5 + ;
  7. const int M = 2e7 + ;
  8. const int Maxn = 2e7;
  9.  
  10. int n, qn, pCnt = , pri[M / ];
  11. ll a[N], phi[M];
  12. bool np[M];
  13.  
  14. template <typename T>
  15. inline void read(T &X) {
  16. X = ; char ch = ; T op = ;
  17. for(; ch > '' || ch < ''; ch = getchar())
  18. if(ch == '-') op = -;
  19. for(; ch >= '' && ch <= ''; ch = getchar())
  20. X = (X << ) + (X << ) + ch - ;
  21. X *= op;
  22. }
  23.  
  24. inline void sieve() {
  25. phi[] = ;
  26. for(int i = ; i <= Maxn; i++) {
  27. if(!np[i]) pri[++pCnt] = i, phi[i] = i - ;
  28. for(int j = ; j <= pCnt && pri[j] * i <= Maxn; j++) {
  29. np[i * pri[j]] = ;
  30. if(i % pri[j] == ) {
  31. phi[i * pri[j]] = phi[i] * pri[j];
  32. break;
  33. }
  34. phi[i * pri[j]] = phi[i] * (pri[j] - );
  35. }
  36. }
  37. }
  38.  
  39. namespace Bit {
  40. ll s[N];
  41.  
  42. #define lowbit(p) (p & (-p))
  43.  
  44. inline void modify(int p, ll v) {
  45. for(; p <= n; p += lowbit(p))
  46. s[p] += v;
  47. }
  48.  
  49. inline ll query(int p) {
  50. ll res = ;
  51. for(; p > ; p -= lowbit(p))
  52. res += s[p];
  53. return res;
  54. }
  55.  
  56. } using namespace Bit;
  57.  
  58. inline ll fpow(ll x, ll y, ll P) {
  59. ll res = ; bool tag = , tagx = ;
  60. for(; y > ; y >>= ) {
  61. if(y & ) {
  62. res = res * x;
  63. tag |= tagx;
  64. if(res >= P) res %= P, tag = ;
  65. }
  66. if(x >= P) x %= P, tagx = ;
  67. x = x * x;
  68. if(x >= P) x %= P, tagx = ;
  69. }
  70. return res + (tag ? P : );
  71. }
  72.  
  73. ll solve(int x, int y, ll P) {
  74. if(P == ) return ;
  75. if(x > y) return ;
  76. ll val = a[x] + query(x), cur = solve(x + , y, phi[P]);
  77. return fpow(val, cur, P);
  78. }
  79.  
  80. int main() {
  81. sieve();
  82. read(n), read(qn);
  83. for(int i = ; i <= n; i++) read(a[i]);
  84. for(int op, x, y; qn--; ) {
  85. read(op), read(x), read(y);
  86. if(op == ) {
  87. ll v; read(v);
  88. modify(x, v), modify(y + , -v);
  89. } else {
  90. ll P; read(P);
  91. printf("%lld\n", solve(x, y, P) % P);
  92. }
  93. }
  94. return ;
  95. }

Luogu 3934 Nephren Ruq Insania的更多相关文章

  1. 洛谷3934:Nephren Ruq Insania——题解

    https://www.luogu.org/problemnew/show/P3934 题面自己读吧(滑稽. 看到这道题就能够想到BZOJ4869:[SHOI2017]相逢是问候我们曾经用过的哲学扩展 ...

  2. [洛谷3934]P3934 Nephren Ruq Insania题解

    先放个奈芙莲 解法 看到这种题目就知道是欧拉降幂,然后根据某玄学证明,递归欧拉降幂从l到r不会超过\(\Theta(log_n)\),所以直接递归解决,然后区间修改直接树状数组维护一下 然后就A了 代 ...

  3. [洛谷P4118][Ynoi2016]炸脖龙I([洛谷P3934]Nephren Ruq Insania)

    题目大意:有$n$个数,每个数为$s_i$,两个操作: $1\;l\;r\;x:$表示将区间$[l,r]$内的数加上$x$ $2\;l\;r\;p:$表示求$s_l^{s_{l+1}^{^{s_{l+ ...

  4. noip模拟赛 Nephren Ruq Insania

    题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 注意:本题大样例4的输出文件修改为 https://pan.baidu.com/s/1b ...

  5. noip2017考前整理(未完)

    快考试了,把我以前写过的题回顾一下.Noip2007 树网的核:floyd,推出性质,暴力.Noip2008 笨小猴:模拟Noip2008 火柴棒等式:枚举Noip2008 传纸条:棋盘dpNoip2 ...

  6. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  7. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  8. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  9. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

随机推荐

  1. @angular/cli项目构建--interceptor

    JWTInterceptor import {Injectable} from '@angular/core'; import {HttpEvent, HttpHandler, HttpInterce ...

  2. 2018.7.6 TX射频调试-PP

    1  电路图 2 layout 3调试 Y1是谐振器,Q1是放大器,C3决定功率(C3容值越大,功率越大)L2与C2构成振荡器(用于调节频偏),R1对功率影响最大. a 功率调试 用频谱仪:功率每+3 ...

  3. 使用kaptcha验证码组件操作演示

    1.创建一个Maven项目 2.在pom.xml中引入相关依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmln ...

  4. Python 2.7_爬取CSDN单页面博客文章及url(二)_xpath提取_20170118

    上次用的是正则匹配文章title 和文章url,因为最近在看Scrapy框架爬虫 需要了解xpath语法 学习了下拿这个例子练手 1.爬取的单页面还是这个rooturl:http://blog.csd ...

  5. BZOJ5334: [Tjoi2018]数学计算

    BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...

  6. Yii的常用URL和渲染方法

    当前页面url  Yii::app()->request->url;跳转前一个页面url $this->redirect(Yii::app()->request->url ...

  7. Mxgraph使用总结二

    1 新建画板,画板相关操作 var container = document.getElementById("main"); //设置背景样式 container.style.ba ...

  8. hl7 v2.X 版本中RSP_K23消息的构造

    RSP_K23消息有MSH, MSA, ERR, QAK, QPD, PID几个segment,其中ERR,PID为可选. 1. 当MSA有err时,ERR段填充出错的详细信息. 2. 当MSA为AA ...

  9. qt在linux下使用open,write,close等文件操作

    正常在linux下使用的文件操作函数为: #include <fcntl.h>fd = open(“path”,O_RDWR|O_NONBLOCK); 但是在qt中,需要使用: #incl ...

  10. 第二届PHP全球开发者大会(含大会的PPT)

    PHP全球开发者大会于2016年5月14日至15日在北京召开 更多现场图片请猛击: http://t.cn/RqeP7y9 ,  http://t.cn/RqD8Typ 最后,这次大会的PPT可以在这 ...