题面

给一个长为 \(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)\) 的大小关系不太好判断,我们可以暴力建一个结构体。

数据结构用树状数组

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int n,m;
int phi[20000003]; namespace bit{
int t[500005];
void clear(){memset(t,0,sizeof(t));}
inline int lowbit(int x){
return x&(-x);
}
int query(int p){
int res=0;
while(p){
res+=t[p];
p-=lowbit(p);
}
return res;
}
void update(int p,int v){
while(p<=n){
t[p]+=v;
p+=lowbit(p);
}
}
void update(int l,int r,int v){
update(l,v);
update(r+1,-v);
}
} void phi_table(int n) {
memset(phi,0,sizeof(phi));
phi[1] = 1;
for (int i = 2; i <= n; i++) {
if (!phi[i]) {
for (int j = i; j <= n; j += i) {
if (!phi[j]) {
phi[j] = j;
}
phi[j] = phi[j] / i * (i - 1);
}
}
}
} int qzh[500005]; typedef pair<int,bool> node; inline node pow(int a,int t,int p){
node res = make_pair(1,0);
if(a>=p){a %= p;res.second = 1;}
while(t){
if(t&1) res.first *= a;
if(res.first>=p){res.second = 1;res.first %= p;}a *= a;
if(a>=p){res.second = 1;a %= p;}t >>= 1;}
return res;
} node solve(int l,int r,int x){
int left=bit::query(l);
node result;
if(x==1){
return make_pair(0,1);
}
if(left==1){
return make_pair(1,0);
}
if(l==r){
return left<x?make_pair(left,0):make_pair(left%x,1);
}
int phiv=phi[x];
result=solve(l+1,r,phiv);
if(result.second){
result.first+=phiv;
}
return pow(left,result.first,x);
} signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin>>n>>m;
phi_table(20000000);
bit::clear();
for(int i=1,tmp;i<=n;i++){
cin>>tmp;
bit::update(i,i,tmp);
}
while(m--){
int op,l,r,p;
cin>>op>>l>>r>>p;
if(op==1){
bit::update(l,r,p);
}
else{
cout<<solve(l,r,p).first<<'\n';
}
}
return 0;
}

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. Response对象页面重定向、时间的动态显示

    Response对象 response对象主要用于对客户端的请求进行回应,将web服务器处理后的结果发回给客户端,封装了jsp产生的响应,并发送到客户端响应客户端的请求,请求的数据可以是各种数据类型, ...

  2. 【SSM】学习笔记(二)——SpringMVC入门

    原视频链接:https://www.bilibili.com/video/BV1Fi4y1S7ix/?p=43&spm_id_from=pageDriver&vd_source=8ae ...

  3. $_SERVER["REQUEST_URI"],在 PHP 众多预定义服务器变量中,$_SERVER["REQUEST_URI"] 算是经常用到的,但是这个变量只有 apache 才支持

    例如访问:http://localhost/index.php?app=lunbo获取到的$_SERVER["REQUEST_URI"]为"/index.php?app= ...

  4. 题解 P4058 [Code+#1]木材

    前言 这什么题啊,不就是个二分答案我从65到100都经历了一遍--(瞬间气哭) \(\sf {Solution}\) 题目理解起来不难的,大意就懒得写了. 一眼二分答案. 此题属于在形如 \(\{0, ...

  5. 关于网页实现串口或者TCP通讯的说明

    概述 最近经常有网页联系我,反馈为什么他按我说的方法,写的HTML代码,无法在chrome网页中运行.这里我统一做一个解释,我发现好多网页并没有理解我的意思. 其实,要实现在HTML中进行串口或者TC ...

  6. 死磕Java面试系列:深拷贝与浅拷贝的实现原理

    深拷贝与浅拷贝的问题,也是面试中的常客.虽然大家都知道两者表现形式不同点在哪里,但是很少去深究其底层原理,也不知道怎么才能优雅的实现一个深拷贝.其实工作中也常常需要实现深拷贝,今天一灯就带大家一块深入 ...

  7. pinpoint:初始化hbase数据库

    安装完成hbase之后,需要初始化hbase的pinpoint库(创建表). 1. 登录数据库 [root@monitor default]# cd /home/pinpoint/hbase-1.7. ...

  8. 设计模式学习(二十四):Spring 中使用到的设计模式

    设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...

  9. 版本控制工具Git介绍-01

    使用版本控制工具是为了方便团队开发,比如多人共同维护一个项目的时候,用版本控制工具可以很方便的维护项目代码,如果哪天你改了一个版本,出问题了,我们也可以很快的找到你改了什么,这里介绍使用比较多的版本控 ...

  10. 高精度加法(Java)

    题目描述 高精度加法,相当于 a+b problem,不用考虑负数. 输入格式 分两行输入. a , b ≤ 10^500 输出格式 输出只有一行,代表 a + b  的值. 思路 使用数组进行模拟, ...