[Ynoi2016] 炸脖龙 I
已经能过 hack,原因:做快速幂的时候需要微判一下边界。很好奇 lxl 为什么不卡
显然区间加可用线段树做。
然后操作二用扩展欧拉定理,每个 \(p\) 最多递归 \(\log\) 层,类似于 这道题。
\(a^b≡a^{b\mod \varphi(p)+\varphi(p)×[b≥ϕ(p)]} (\text{mod}\ \ p)\)
问题来了,扩欧有两种情况,我们如何判断?
这个简单,暴力跑一遍会不会超出即可。
然后发现这里只需单点查询,把线段树换成常数更小的树状数组。
现在我们考虑一波边界问题:
当 \(\text{mod}\) 为 \(1\) 时,此时不管是什么数都是 \(0\);
底数 \(\text{a}\) 为 \(1\) 时,不管多少幂都是 \(1\);
递归到底时再判断是否需要加上 \(\varphi(p)\) 即可。
多取点模,这题不卡常!!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的更多相关文章
- [洛谷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+ ...
- BZOJ 5394 [Ynoi2016]炸脖龙 (线段树+拓展欧拉定理)
题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同 对于区间修改,由线段树完成,没什么好说 ...
- BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)
就是让你求这个: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5394 解题思路: NOIP2018后第一道题,感觉非常像那个上帝与集合的 ...
- P4118 [Ynoi2016]炸脖龙I
思路:扩展欧拉定理 提交:\(\geq5\)次 错因:快速幂时刚开始没有判断\(a\)是否大于\(p\) 题解: 用树状数组维护差分,查询时暴力从左端点的第一个数向右端点递归,若递归时发现指数变为\( ...
- Luogu P4118 [Ynoi2016]炸脖龙I
题目 首先考虑没有修改的情况.显然直接暴力扩展欧拉定理就行了,单次复杂度为\(O(\log p)\)的. 现在有了修改,我们可以树状数组维护差分数组,然后\(O(\log n)\)地单次查询单点值. ...
- P3934 [Ynoi2016] 炸脖龙 I
题面 给一个长为 \(n\) 的序列,\(m\) 次操作,每次操作: 1.区间 \([l,r]\) 加 \(x\) 2.对于区间 \([l,r]\),查询: \[a[l]^{a[l+1]^{a[l+2 ...
- Luogu 3934 Nephren Ruq Insania
和Ynoi2016 炸脖龙重题了. BZOJ 5394. 首先是扩展欧拉定理: 一开始傻掉了……递归的层数和区间长度无关……也就是说我们每一次直接暴力递归求解子问题一定不会超过$logP$层,因为当模 ...
- bzoj5000+的洛谷题号
前言 闲得没事把 bzoj5000+ 在 Luogu 上可找到的题面整理了一下-- 对于我,bzoj 连账号都没有,所以肯定是不清楚 bzoj 题目总数的--因此其实就是手动翻查. 工作量很大,基本不 ...
- [NOI2002]贪吃的九头龙(树形dp)
[NOI2002]贪吃的九头龙 题目背景 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是 说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的 ...
- 龙之谷手游WebVR技术分享
主要面向Web前端工程师,需要一定Javascript及three.js基础:本文主要分享内容为基于three.js开发WebVR思路及碰到的问题:有兴趣的同学,欢迎跟帖讨论. 目录:一.项目体验1. ...
随机推荐
- sql server2008r2其中一张表不能任何操作
用户的数据库一张高频表,使用select count(*) from t1 竟然一直在转圈,显示开始,而没有end. 找尽原因不得果.把数据库备份后在恢复,可以使用几小时,之后又是老毛病抽风. 用户生 ...
- 测试工作中用到的Redis命令
由于项目测试的需要,经常需要连接Redis数据库修改某些键值,无奈最近Redis的客户端连接工具使用不了 只有使用命令行来操作了,现总结如下: 1.远程连接Redis redis-cli -h hos ...
- Java 的 CMS 垃圾回收流程
Java 的 CMS 垃圾回收流程 CMS(Concurrent Mark-Sweep)垃圾回收器 是一种并发垃圾回收器,旨在减少垃圾回收时的停顿时间,适用于对低延迟要求较高的应用.CMS 主要通过并 ...
- centos停服,迁移centos7.3系统到新搭建的openEuler
背景 最近在做的事,简单来讲,就是一套系统差不多有10多台虚拟机,都是centos系统,版本主要是7.3.7.6.7.9,现在centos停止维护了,转为了centos stream,而centos ...
- Maven依赖冲突解决方案:调解规则与工具实践
结论先行 Maven解决依赖冲突的核心机制是 依赖调解 和 显式排除 ,并通过插件(如maven-dependency-plugin.maven-enforcer-plugin和Maven Helpe ...
- 解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问"
解决NET Core发布iis项目覆盖原有的项目时"另一个程序正在使用此文件,进程无法访问" 现在net core运用的多了,一系列的问题接踵而来,更新项目发布到iis时就有一个坑 ...
- Centos 7 关于防火墙的命令
有些人安装的linux的系统默认防火墙不是iptables,而是firewall,那就得使用以下方式关闭防火墙了. >>>关闭防火墙 systemctl stop firewalld ...
- 【SQL周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 6 篇,也是[SQL 周周练]系列的第 5 篇.该系列是挑选或 ...
- 【SpringBoot异步导入Excel实战】从设计到优化的完整解决方案
SpringBoot异步导入Excel实战:从设计到优化的完整解决方案 一.背景与需求 在企业级应用中,Excel导入是常见需求.当导入数据量较大时,同步处理可能导致接口阻塞,影响用户体验.本文结合S ...
- Go Gob编码
gob(Go binary)是Goland包自带的一个数据结构序列化的编码/解码工具.编码使用Encoder,解码使用Decoder.一种典型的应用场景就是RPC(remote procedure c ...