题目传送门

已经能过 hack,原因:做快速幂的时候需要微判一下边界。很好奇 lxl 为什么不卡

显然区间加可用线段树做。

然后操作二用扩展欧拉定理,每个 \(p\) 最多递归 \(\log\) 层,类似于 这道题

\(a^b≡a^{b\mod \varphi(p)+\varphi(p)×[b≥ϕ(p)]} (\text{mod}\ \ p)\)

问题来了,扩欧有两种情况,我们如何判断?

这个简单,暴力跑一遍会不会超出即可。

然后发现这里只需单点查询,把线段树换成常数更小的树状数组。

现在我们考虑一波边界问题:

  1. 当 \(\text{mod}\) 为 \(1\) 时,此时不管是什么数都是 \(0\);

  2. 底数 \(\text{a}\) 为 \(1\) 时,不管多少幂都是 \(1\);

  3. 递归到底时再判断是否需要加上 \(\varphi(p)\) 即可。

  4. 多取点模,这题不卡常!!1

这样就可以愉快地写代码去啦~。

Code:

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <bitset>
#define int long long
using namespace std;
inline int read(){
char ch=getchar();int x=0, f=1;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int INF=0x3f3f3f3f;
const int N=(int)(500005);
const int M=(int)(20000005);
struct BIT{
#define lowbit(x) (x&(-x))
int sum[N];
void add(int x, int y){if(!y) return ;for(; x<N; x+=lowbit(x)) sum[x]+=y;}
int query(int x){int ret=0;for(; x>0; x-=lowbit(x)) ret+=sum[x];return ret;}
}bit;
struct node{int v;bool flg;};
node ksm(int a, int b, int mo){
node ret=(node){1, 0};
int tmp=a%mo;if(a>=mo) ret.flg=true, ret.v%=mo;
while(b){
if(b&1) ret.v*=tmp;
if(ret.v>=mo) ret.flg=true, ret.v%=mo;
tmp*=tmp;
if((b/2)&&tmp>=mo) ret.flg=1, tmp%=mo;
b>>=1;
}
return ret;
}
int n, m, phi[M], st[M], tot, a[N];
bitset <M> u;
void pre(int lim=20000000){
phi[1]=1;
for(int i=2; i<=lim; i++){
if(!u[i]) st[++tot]=i, phi[i]=i-1;
for(int j=1; j<=tot&&i*st[j]<=lim; j++){
u[i*st[j]]=1;
if(i%st[j]==0){phi[i*st[j]]=phi[i]*st[j];break;}
phi[i*st[j]]=phi[i]*(st[j]-1);
}
}
}
node solve(int l, int r, int p){
int tmp=bit.query(l);//printf("--%d %d %lld %lld\n", l, r, tmp, p);
if(p==1) return (node){0, 1};
if(l==r) return tmp>=p?(node){tmp%p, 1}:(node){tmp, 0};
if(tmp==1) return (node){1, 0};
node mi=solve(l+1, r, phi[p]);
if(mi.flg) mi.v+=phi[p];
return ksm(tmp, mi.v, p);
}
signed main(){
n=read(), m=read(), pre();
for(int i=1; i<=n; i++)
a[i]=read(), bit.add(i, a[i]-a[i-1]);
for(int i=1; i<=m; i++){
int opt=read(), l=read(), r=read();
int p=read();
if(opt&1) bit.add(l, p), bit.add(r+1, -p);
else printf("%lld\n", (solve(l, r, p).v%p+p)%p);
}
return 0;
}

[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. P3934 [Ynoi2016] 炸脖龙 I

    题面 给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作: 1.区间 \([l,r]\) 加 \(x\) 2.对于区间 \([l,r]\),查询: \[a[l]^{a[l+1]^{a[l+2 ...

  7. Luogu 3934 Nephren Ruq Insania

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

  8. bzoj5000+的洛谷题号

    前言 闲得没事把 bzoj5000+ 在 Luogu 上可找到的题面整理了一下-- 对于我,bzoj 连账号都没有,所以肯定是不清楚 bzoj 题目总数的--因此其实就是手动翻查. 工作量很大,基本不 ...

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

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

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

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

随机推荐

  1. Sql查询(Select)语句实例

    span { color: rgba(255, 0, 0, 1) } Select 结构: 句子结构: Select 列名 [all/distinct] from 表名 where 条件 group ...

  2. 微信接龙转Excel

    1.新建Excel表格 2.将微信接龙信息复制至表格 3.选择列 4.选择[数据]->[分列] 5.选择[分隔符号]->[下一步] 6.选择[分隔符号]->[下一步] 这里以[空格] ...

  3. kette介绍-Step之Table output

    表输入(Table output)介绍: Table output步骤常被用于将转换中的行集从内存持久化到数据库,对转换而言是 行集被拿出去的感觉,故名为输出.可以限制提交记录数量和指定插入的目标表 ...

  4. spring-boot静态资源目录配置

    spring-boot静态资源目录配置(配置js.css.图片等资源的位置) spring-boot静态资源默认为/src/main/resources下的/static目录,可以通过applicat ...

  5. Asp.net core 少走弯路系列教程(四)JavaScript 学习

    前言 新人学习成本很高,网络上太多的名词和框架,全部学习会浪费大量的时间和精力. 新手缺乏学习内容的辨别能力,本系列文章为新手过滤掉不适合的学习内容(比如多线程等等),让新手少走弯路直通罗马. 作者认 ...

  6. hadoop部署安装(三)zookeeper+yarn

    1. 配置zookeeper 3.1 解压存放指定目录 [root@bogon src]# tar xf zookeeper-3.4.10.tar.gz [root@bogon src]# mv zo ...

  7. 内网穿透——Natapp实现

    转自:NATAPP使用教程(内网穿透)_Willing卡卡的博客-CSDN博客_natapp NATAPP内网穿透使用教程 本文主要分享了有关内网穿透NATAPP的使用,包括:注册.建立隧道(免费). ...

  8. MCP-Playwright:AI自动化神器,一款超级好用的自动化测试框架!

    在软件开发与测试领域,自动化测试早已成为提升效率.保障质量的核心工具.然而,传统自动化测试框架往往面临代码编写繁琐.跨工具协作困难.操作复杂等痛点. 而今天,给大家介绍一款自动化测试工具:MCP-Pl ...

  9. LSposed hook(学习分享)

    Xposed模块编写 参考: https://www.52pojie.cn/thread-1740944-1-1.html https://www.52pojie.cn/thread-1748081- ...

  10. Sentinel——服务降级

    目录 简介 Sentinel方法级降级 Sentinel类级降级 OpenFeign类级降级 简介 服务降级是一种增强用户体验的方式.当用户的请求由于各种原因被拒后,系统返回-一个事先设定好的.用户可 ...