Luogu P4118 [Ynoi2016]炸脖龙I
Link
首先考虑没有修改的情况。显然直接暴力Ex-Euler定理就行了,单次复杂度为\(O(\log p)\)的。
现在有了修改,我们可以树状数组维护差分数组,然后\(O(\log n)\)地单次查询单点值。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
namespace IO
{
char ibuf[(1<<21)+1],obuf[(1<<21)+1],st[15],*iS,*iT,*oS=obuf,*oT=obuf+(1<<21);
char Get(){return (iS==iT? (iT=(iS=ibuf)+fread(ibuf,1,(1<<21)+1,stdin),(iS==iT? EOF:*iS++)):*iS++);}
void Flush(){fwrite(obuf,1,oS-obuf,stdout),oS=obuf;}
void Put(char x){*oS++=x;if(oS==oT)Flush();}
int read(){int x=0;char ch=Get();while(ch>57||ch<48)ch=Get();while(ch>=48&&ch<=57)x=x*10+(ch^48),ch=Get();return x;}
void write(int x){int top=0;if(x<0)Put('-'),x=-x;if(!x)Put('0');while(x)st[++top]=(x%10)+48,x/=10;while(top)Put(st[top--]);Put('\n');}
}
using namespace IO;
void max(int &a,int b){a=a>b? a:b;}
#define N 500007
#define M 20000007
int n,phi[M],p[M>>3],opt[N],l[N],r[N],P[N];
bitset<M>vis;
LL c[N];
void add(int p,int v){while(p<=n)c[p]+=v,p+=p&-p;}
LL query(int p){LL v=0;while(p)v+=c[p],p-=p&-p;return v;}
void modify(int l,int r,int v){add(l,v),add(r+1,-v);}
struct node{LL num;int flg;node(LL Num=0,int Flg=0):num(Num),flg(Flg){}};
node power(LL a,int k,int p)
{
node ans=node(1,0);
if(a>=p) a%=p,ans.flg=1;
while(k)
{
if(k&1) ans.num=ans.num*a;
if(ans.num>=p) ans.num%=p,ans.flg=1;
a*=a,k>>=1;
if(a>=p) a%=p,ans.flg=1;
}
return ans;
}
node calc(int l,int r,int p)
{
LL a=query(l);
if(p==1) return node(0,1);
if(a==1) return node(1,0);
if(l==r) return a<p? node(a,0):node(a%p,1);
int Phi=phi[p];node ans=calc(l+1,r,Phi);
if(ans.flg) ans.num+=Phi;
return power(a,ans.num,p);
}
int main()
{
n=read();int Q=read(),i,j,tot=0,Max=0;
for(i=1;i<=n;++i) tot=read(),modify(i,i,tot);
for(i=1;i<=Q;++i)
{
opt[i]=read(),l[i]=read(),r[i]=read(),P[i]=read();
if(opt[i]==2) max(Max,P[i]);
}
for(tot=0,phi[1]=1,i=2;i<=Max;++i)
{
if(!vis[i]) p[++tot]=i,phi[i]=i-1;
for(j=1;i*p[j]<=Max&&j<=tot;++j)
{
vis[i*p[j]]=1;
if(!(i%p[j])){phi[i*p[j]]=phi[i]*p[j];break;}
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for(i=1;i<=Q;++i)if(opt[i]==1) modify(l[i],r[i],P[i]); else write(calc(l[i],r[i],P[i]).num);
return Flush(),0;
}
Luogu P4118 [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+ ...
- P4118 [Ynoi2016]炸脖龙I
思路:扩展欧拉定理 提交:\(\geq5\)次 错因:快速幂时刚开始没有判断\(a\)是否大于\(p\) 题解: 用树状数组维护差分,查询时暴力从左端点的第一个数向右端点递归,若递归时发现指数变为\( ...
- 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后第一道题,感觉非常像那个上帝与集合的 ...
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...
- luogu P4688 [Ynoi2016]掉进兔子洞
luogu 我们要求的答案应该是三个区间长度\(-3*\)在三个区间中都出现过的数个数 先考虑数列中没有相同的数怎么做,那就是对三个区间求交,然后交集大小就是要求的那个个数.现在有相同的数,考虑给区间 ...
- Luogu 3934 Nephren Ruq Insania
和Ynoi2016 炸脖龙重题了. BZOJ 5394. 首先是扩展欧拉定理: 一开始傻掉了……递归的层数和区间长度无关……也就是说我们每一次直接暴力递归求解子问题一定不会超过$logP$层,因为当模 ...
- 单词接龙dfs洛谷
题目传送门:https://www.luogu.org/problem/show?pid=1019#sub 典型的爆搜,每次更新最大龙长度即可 搜索每个字符串编号,与已经连接好的字符串进行比较,以此往 ...
随机推荐
- Js模块化开发--seajs和gruntJs
1.Seajs库 解决开发中的冲突依赖等问题,提供代码可维护性. SeaJS 是由玉伯开发的一个遵循 CommonJS 规范的模块加载框架,可用来轻松愉悦地加载任意 JavaScript 模块和css ...
- triplet
询问次数<=min(2*n,n+35) 一种类似hash的交互题 部分分n=5,限制10次 发现都问出来可以通过次数和大小确定所有的值和对应位置! n比较大 发现(X1,X2,i)能确定一些情况 ...
- iOS8-Sampler
https://github.com/shu223/iOS8-Sampler iOS8-Sampler Code examples for the new functions of iOS 8. Ho ...
- 邻居子系统 之 邻居项创建__neigh_create
概述 IP层输出数据包会根据路由的下一跳查询邻居项,如果不存在则会调用__neigh_create创建邻居项,然后调用邻居项的output函数进行输出: __neigh_create完成邻居项的创建, ...
- HLS协议解析
1. 综述 HLS(HTTP Live Streaming) 把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些.HLS 协议由三部分组成:HTTP.M3U8.TS.这三部分中,HTT ...
- LC 687. Longest Univalue Path
Given a binary tree, find the length of the longest path where each node in the path has the same va ...
- Python获取两个文件的交集、并集、差集
题记:朋友在处理数据时,需要解决这方面的问题,所以利用她给的代码,自己重新梳理了下,并成功运行. 代码如下: # coding:utf-8 s1 = set(open(r'C:\\Users\\yan ...
- distinct 与group by 去重
mysql中常用去重复数据的方法是使用 distinct 或者group by ,以上2种均能实现,但2者也有不同的地方. distinct 特点: 如:select distinct nam ...
- 六十九:flask上下文之线程隔离的g对象的使用
保存全局对象的g对象g对象是在整个flask应用运行期间都是可以使用的,并且也是和request一样,是线程隔离的,这个对象是专门用来存放开发者自己定义的一些数据,方便在整个flask程序中都可以使用 ...
- 反向代理,负载均衡——nginx理论
nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势. nginx架构? ...