题目大意:有$n$个数,每个数为$s_i$,两个操作:

  1. $1\;l\;r\;x:$表示将区间$[l,r]$内的数加上$x$
  2. $2\;l\;r\;p:$表示求$s_l^{s_{l+1}^{^{s_{l+2}\dots}}}\bmod p$直到$s_r$

题解:区间加可以通过树状数组维护,考虑操作二,由扩展欧拉定理可得:
$$
a^b\equiv
\begin{cases}
a^{b\bmod{\varphi(p)}} &(a,b)=1\\
a^b &(a,b)\not=1,b<\varphi(p)\\
a^{b\bmod{\varphi(p)}+\varphi(p)} &(a,p)\not=1,b\geqslant\varphi(p)
\end{cases}
\pmod{p}
$$
$\varphi$函数最多递归$O(\log_2)$层就会变成$1$,可以暴力算

注意要在快速幂里面记录取过模,若取过,最后要加上一个$p$

卡点:没注意快速幂中部分,没有开$long\;long$

C++ Code:

#include <cstdio>
#include <cctype>
namespace __IO {
namespace R {
int x, ch;
inline int read() {
while (isspace(ch = getchar()));
for (x = ch & 15; isdigit(ch = getchar()); ) x = x * 10 + (ch & 15);
return x;
}
}
}
using __IO::R::read; #define maxn 500010 int n, m;
namespace BIT {
long long Tr[maxn], res;
inline void add(int p, const int x) {for (; p <= n; p += p & -p) Tr[p] += x;}
inline long long ask(int p) {for (res = 0; p; p &= p - 1) res += Tr[p]; return res;}
} namespace Math {
const int N = 2e7 + 1;
int phi[N], plist[N], ptot;
bool notp[N];
void sieve() {
phi[1] = 1;
for (int i = 2; i < N; i++) {
if (!notp[i]) phi[plist[ptot++] = i] = i - 1;
for (int j = 0, t; j < ptot && (t = i * plist[j]) < N; j++) {
notp[t] = true;
if (i % plist[j] == 0) {
phi[t] = phi[i] * plist[j];
break;
}
phi[t] = phi[i] * phi[plist[j]];
}
}
} inline long long pw(long long base, long long p, const int mod) {
long long res = 1, b = base, tmp = 0;
if (b >= mod && p) tmp = mod, b %= mod;
for (; p; p >>= 1) {
if (p & 1) {
res = res * b;
if (res >= mod) tmp = mod, res %= mod;
}
b = b * b;
if (b >= mod && p >> 1) tmp = mod, b %= mod;
}
return res + tmp;
}
}
using Math::phi; long long query(const int l, const int r, const int p) {
const long long x = BIT::ask(l);
if (!x) return 0;
if (x % p == 0) return p;
if (l == r) return x >= p ? x % p + p : x;
return Math::pw(x, query(l + 1, r, phi[p]), p);
} int main() {
Math::sieve();
n = read(), m = read();
for (int i = 1, last = 0, x; i <= n; ++i) {
x = read();
BIT::add(i, x - last);
last = x;
}
while (m --> 0) {
int op = read(), l = read(), r = read(), x = read();
if (op == 1) BIT::add(l, x), BIT::add(r + 1, -x);
else printf("%lld\n", query(l, r, x) % x);
}
return 0;
}

  

[洛谷P4118][Ynoi2016]炸脖龙I([洛谷P3934]Nephren Ruq Insania)的更多相关文章

  1. P4118 [Ynoi2016]炸脖龙I

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

  2. Luogu P4118 [Ynoi2016]炸脖龙I

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

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

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

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

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

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

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

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

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

  7. 洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)

    洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是 ...

  8. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

    题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...

  9. 单词接龙dfs洛谷

    题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...

随机推荐

  1. dubbo之监控中心(monitor)

    一.monitor是dubbo框架中的一个监控中心.这个只是针对于消费者和提供者进行一个数据记录,不参与业务和使用.当然当monitor挂掉之后,也不会影响服务的正常运行. 二.在阿里的dubbo中也 ...

  2. webpack loader 生成虚拟文件的方案

    此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...

  3. python学习五

    打包代码与数据 数据结构要与数据匹配,数据结构影响代码的复杂性   列表 集合 字典 #创建与初始化 cleese={} cleese2=dict() cleese["name"] ...

  4. package.json中的devDependencies和dependencies有啥区别?

    如果你的项目是发布到npm的一个包, 那么这个包的package.json中的dependencies中的依赖是会被下载下来到这个包的node_modules文件夹中的(如果你的项目本身没有这个依赖) ...

  5. div布局方案整理

    实际项目开发过程中遇到页面 DIV 左右布局的需求:左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面,由此引申出本文的几种解决方案 1 左侧 DIV 设置 float 属性为 left ...

  6. 查找 二叉树中 k1 到 k2区间的节点

    vector<int> res; int key1, key2; void traverse(TreeNode * root){//采用前序遍历 if(root == NULL) retu ...

  7. GitHub把自己整个文件夹上传

    我已经有了自己github,但是我怎么对我的项目进行上传呢,普通的上传只有上传单一的文件 这不我去下载了Git(链接至机房ftp文件夹下文件ftp://10.64.130.1/%C8%ED%BC%FE ...

  8. es6从零学习(一)let 和 const 命令

    es6从零学习(一):let 和 const 命令 一:let 变量 1.块级作用域{}:let只在自己的块级作用域内有效. for(let i =0;i<3;i++) { console.lo ...

  9. NIO 服务端TCP连接管理的方案

    最近做的一个项目需要在服务端对连接端进行管理,故将方案记录于此. 方案实现的结果与背景 因为服务端与客户端实现的是长连接,所以需要对客户端的连接情况进行监控,防止无效连接占用资源. 完成类似于心跳的接 ...

  10. python 项目配置虚拟环境

    # Windows 环境1, 安装 Visual C++ 2015 Build Tools, 依赖.Net Framework 4.6, 安装包位置 ./tools/windows/visualcpp ...