题目传送门

已经能过 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. 【JDBC第8章】数据库连接池

    第8章:数据库连接池 8.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接 进行sql操作 ...

  2. Go 中 JSON 的序列化和反序列化

    golang中对json的序列化/反序列化操作还是比较容易的, 序列化操作主要是通过encoding/json包的Marshal()方法来实现, 反序列化操作主要是通过encoding/json包的U ...

  3. 使用克魔助手查看iOS 应用程序使用历史记录和耗能历史记录

    使用克魔助手查看iOS 应用程序使用历史记录和耗能历史记录 功能概述 克魔助手无需越狱即可访问iOS上各个应用程序的历史记录,包括: 最近几个月的app的详细启动时间记录,结束时间,app使用的硬件组 ...

  4. Hangfire Redis 实现秒级定时任务、使用 CQRS 实现动态执行代码

    目录 定时任务需求 核心逻辑 使用 Redis 实现秒级定时任务 第一步 第二步 第三步 第四步 业务服务实现动态代码 第一步 第二步 第三步 第四步 第五步 最后 定时任务需求 本文示例项目仓库:w ...

  5. 游戏开发之Cocos3着色器/shader快速入门

    本文为学习笔记,不排除有谬误,但确保都是亲测.另外,傻狗百度收不收录的无所谓,我来博客园就是为了记记笔记. 对于新人,首先明确一点:shader需要通过材质的方式作用于模型上 所以有个很关键的步骤,c ...

  6. 开发者专用部署工具PasteSpider的V5正式版发布啦!(202504月版),更新说明一览

    PasteSpider是一款以开发者角度设计的部署工具,支持把你的项目部署到Windows或者Linux服务器,支持5大模式Windows(IIS/Service),Linux(systemd),Do ...

  7. Java编程--抽象类和接口的区别

    No. 区别 抽象类 接口 1 关键字 abstract class interface 2 组成 构造方法.普通方法.抽象方法.static方法.常量.变量 抽象方法.全局常量 3 子类使用 cla ...

  8. 【经验】VMware|Win11的Ubuntu虚拟机启动虚拟化,报错此平台不支持虚拟化的 Intel VT-x/EPT(方案汇总+自己的解决方案)

    2024/04/24说明:这篇暂时修改为粉丝可见,因为正在冲粉丝量,等到我弄完了粉丝量的要求,我就改回来!不方便看到全文的小伙伴不好意思!! 我开虚拟化是为了在虚拟机中运行VirtualBox,如果不 ...

  9. dashboard部署

    1.下载dashboard资源请单 wget  https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/re ...

  10. django实例(1)

    Urls.py from django.contrib import adminfrom django.conf.urls import urlfrom cmdb import viewsurlpat ...