题面

给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作:

1、区间 \([l,r]\) 加 \(x\)

2、对于区间 \([l,r]\),查询:

\[a[l]^{a[l+1]^{a[l+2]^{\dots ^{a[r]}}}} \pmod p
\]

\(n , m \le 500000\) , 序列中每个数在 \([1,2\cdot 10^9]\) 内,\(p \le 2 \cdot 10^7\) , 每次加上的数在 \([0,2\cdot 10^9]\) 内

思路

见区间操作,想线段树,但是这道题是可以树状数组的。

首先大家应该知道扩展欧拉定理(EX Euler Theorem):

\[a^{b} \equiv \left\{\begin{align}
a^{b}\ (b \lt φ(p))\\
a^{b \mod φ(p)+φ(p)}(b \ge φ(p))
\end{align}\right.\pmod{p}
\]

然后我们就可以设计一个递推来处理 \(2\) 操作。

注意,\(b\) 和 \(φ(p)\) 的大小关系不太好判断,我们可以暴力建一个结构体。

数据结构用树状数组

代码

  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,m;
  5. int phi[20000003];
  6. namespace bit{
  7. int t[500005];
  8. void clear(){memset(t,0,sizeof(t));}
  9. inline int lowbit(int x){
  10. return x&(-x);
  11. }
  12. int query(int p){
  13. int res=0;
  14. while(p){
  15. res+=t[p];
  16. p-=lowbit(p);
  17. }
  18. return res;
  19. }
  20. void update(int p,int v){
  21. while(p<=n){
  22. t[p]+=v;
  23. p+=lowbit(p);
  24. }
  25. }
  26. void update(int l,int r,int v){
  27. update(l,v);
  28. update(r+1,-v);
  29. }
  30. }
  31. void phi_table(int n) {
  32. memset(phi,0,sizeof(phi));
  33. phi[1] = 1;
  34. for (int i = 2; i <= n; i++) {
  35. if (!phi[i]) {
  36. for (int j = i; j <= n; j += i) {
  37. if (!phi[j]) {
  38. phi[j] = j;
  39. }
  40. phi[j] = phi[j] / i * (i - 1);
  41. }
  42. }
  43. }
  44. }
  45. int qzh[500005];
  46. typedef pair<int,bool> node;
  47. inline node pow(int a,int t,int p){
  48. node res = make_pair(1,0);
  49. if(a>=p){a %= p;res.second = 1;}
  50. while(t){
  51. if(t&1) res.first *= a;
  52. if(res.first>=p){res.second = 1;res.first %= p;}a *= a;
  53. if(a>=p){res.second = 1;a %= p;}t >>= 1;}
  54. return res;
  55. }
  56. node solve(int l,int r,int x){
  57. int left=bit::query(l);
  58. node result;
  59. if(x==1){
  60. return make_pair(0,1);
  61. }
  62. if(left==1){
  63. return make_pair(1,0);
  64. }
  65. if(l==r){
  66. return left<x?make_pair(left,0):make_pair(left%x,1);
  67. }
  68. int phiv=phi[x];
  69. result=solve(l+1,r,phiv);
  70. if(result.second){
  71. result.first+=phiv;
  72. }
  73. return pow(left,result.first,x);
  74. }
  75. signed main(){
  76. ios::sync_with_stdio(false);
  77. cin.tie(nullptr);
  78. cout.tie(nullptr);
  79. cin>>n>>m;
  80. phi_table(20000000);
  81. bit::clear();
  82. for(int i=1,tmp;i<=n;i++){
  83. cin>>tmp;
  84. bit::update(i,i,tmp);
  85. }
  86. while(m--){
  87. int op,l,r,p;
  88. cin>>op>>l>>r>>p;
  89. if(op==1){
  90. bit::update(l,r,p);
  91. }
  92. else{
  93. cout<<solve(l,r,p).first<<'\n';
  94. }
  95. }
  96. return 0;
  97. }

P3934 [Ynoi2016] 炸脖龙 I的更多相关文章

  1. [洛谷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+ ...

  2. BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)

    题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同 对于区间修改,由线段树完成,没什么好说 ...

  3. BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)

    就是让你求这个: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5394 解题思路: NOIP2018后第一道题,感觉非常像那个上帝与集合的 ...

  4. P4118 [Ynoi2016]炸脖龙I

    思路:扩展欧拉定理 提交:\(\geq5\)次 错因:快速幂时刚开始没有判断\(a\)是否大于\(p\) 题解: 用树状数组维护差分,查询时暴力从左端点的第一个数向右端点递归,若递归时发现指数变为\( ...

  5. Luogu P4118 [Ynoi2016]炸脖龙I

    题目 首先考虑没有修改的情况.显然直接暴力扩展欧拉定理就行了,单次复杂度为\(O(\log p)\)的. 现在有了修改,我们可以树状数组维护差分数组,然后\(O(\log n)\)地单次查询单点值. ...

  6. Luogu 3934 Nephren Ruq Insania

    和Ynoi2016 炸脖龙重题了. BZOJ 5394. 首先是扩展欧拉定理: 一开始傻掉了……递归的层数和区间长度无关……也就是说我们每一次直接暴力递归求解子问题一定不会超过$logP$层,因为当模 ...

  7. [NOI2002]贪吃的九头龙(树形dp)

    [NOI2002]贪吃的九头龙 题目背景 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是 说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的 ...

  8. 龙之谷手游WebVR技术分享

    主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一.项目体验1. ...

  9. DX12龙书第6章习题

    1. { { , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, }, { , DXGI_FO ...

随机推荐

  1. HTML+CSS基础知识(4)简单的广告界面

    文章目录 1.网页实例 1.1 代码 1.2 测试效果 1.网页实例 1.1 代码 css样式 /* 清除页面样式 */ *{ margin:0; padding: 0; } /* 统一页面的样式 * ...

  2. LcdTools如何导出内置画面为bmp图片

    运行LcdTools,先设置好图片所需分辨率参数,点击"画面设置"栏,修改下图所示参数 点击"画面设置"栏,在"画面资源"栏找到需要导出的画 ...

  3. docker swarm快速部署redis分布式集群

    环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...

  4. 十八、Service的应用

    Service 的应用 ClusterIP ​clusterIP 主要在每个 node 节点使用 ipvs,将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中.然后 kube ...

  5. mybatis-自定义映射resultMap

    自定义映射resultMap resultMap处理字段和属性的映射关系 resultMap:设置自定义映射 属性: id:表示自定义映射的唯一标识,不能重复 type:查询的数据要映射的实体类的类型 ...

  6. CodeQL(1)

    前言 开始学习使用CodeQL,做一些笔记,可供参考的资料还是比较少的,一个是官方文档,但是Google翻译过来,总觉得怪怪的,另一个就是别人的一个资源整合,其中可供参考的也不是很多,大多也是官方文档 ...

  7. JqGrid 编辑单元格内容时提示url未设定错误 2018-08-06

    感谢大佬的资料https://blog.csdn.net/Easy_____/article/details/30218421 虽然没实例,但也给了一些信息.我以为cellsubmit属性是添加到co ...

  8. vue-element Form表单验证没错却一直提示错误

    在使用element-UI 的表单时,发生一个验证错误,已输入值但验证的时候却提示没有输入 修改前 <el-form-item>中的prop绑定的是cus_name,而item里面的控件绑 ...

  9. X活手环的表盘自定义修改

    文章用到的所有工具及软件成品 前言 前几天我在某宝买了一个智能手环,无奈软件中的表盘太少,所有我想着修改一下app中的资源文件. 反编译APK 这里反编译APK用apktool工具就可以. apkto ...

  10. Navicat mysql创建数据库、用户、授权、连接

    一.数据库的创建 调出命令窗口并创建数据库: create database itcast_oa default character set utf8;----创建数据库 二.数案件用户 create ...