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

题目大意:给你一个序列,需要支持区间修改,以及查询一段区间$a_{i}^{a_{i+1}^{a_{i+2}...}}mod\;p$的值,每次询问的$p$的值不同

对于区间修改,由线段树完成,没什么好说的

对于查询,利用"上帝与集合的正确用法"那道题的方法,不断取$\phi(p)$降幂,那么最多迭代$log$层

由于$ai$不一定和$p$互质,需要使用拓展欧拉定理

$ans=ai^{Ans_{i+1}\;mod\;\phi(p)+Ans_{i+1}>=\phi(p)?\phi(p):0}$

每层都记录$Ans_{i}$是否对这一层的$p$取过模,用于判断Ans_{i+1}>=\phi(p)

 

特判比较多,注意特判的优先级

1.如果$ai mod p==0$,那么不论接下来是几次幂都返回0

2.如果$ai==1$,那么不论$ai$的多少次幂都是1,同时清空已经取过模的标记

3.如果$i+1$层取过模,那么这一层的运算即使没取模也要标记为取过模,因为实际值一定取模了

4.如果$i+1$层取过模,那么快速幂里需要加上$\phi(p)$,反之$i+1$没取模一定不要加,不然答案是错的

5.接下来在快速幂里更新第i层计算的取模标记

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #define NN 501000
  5 #define MM 20001000
  6 #define maxn 20000000
  7 #define ll long long 
  8 #define uint unsigned int
  9 #define ull unsigned long long 
 10 using namespace std;
 11 
 12 int n,m,g,r,root;
 13 int gint()
 14 {
 15     int ret=0,fh=1;char c=getchar();
 16     while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}
 17     while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
 18     return ret*fh;
 19 }
 20 int use[MM],pr[2000000],phi[MM],cnt;
 21 void Pre()
 22 {
 23     phi[1]=1;
 24     for(int i=2;i<=maxn;i++)
 25     {
 26         if(!use[i]) pr[++cnt]=i,phi[i]=i-1;
 27         for(int j=1;j<=cnt&&i*pr[j]<=maxn;j++){
 28             use[i*pr[j]]=1;
 29             if(i%pr[j]) phi[i*pr[j]]=phi[i]*phi[pr[j]];
 30             else {phi[i*pr[j]]=phi[i]*pr[j];break;}
 31         }
 32     }
 33 }
 34 struct Seg{
 35 ull val[NN<<2],tag[NN<<2];
 36 void pushdown(int rt){
 37     if(!tag[rt]) return;
 38     val[rt<<1]+=tag[rt],val[rt<<1|1]+=tag[rt];
 39     tag[rt<<1]+=tag[rt],tag[rt<<1|1]+=tag[rt];
 40     tag[rt]=0;
 41 }
 42 void update(int L,int R,int l,int r,int rt,int w)
 43 {
 44     if(L<=l&&r<=R){tag[rt]+=w,val[rt]+=w;return;}
 45     int mid=(l+r)>>1;pushdown(rt);
 46     if(L<=mid) update(L,R,l,mid,rt<<1,w);
 47     if(R>mid) update(L,R,mid+1,r,rt<<1|1,w);
 48     //pushup(rt);
 49 }
 50 ull query(int x,int l,int r,int rt)
 51 {
 52     if(l==r) return val[rt];
 53     int mid=(l+r)>>1;pushdown(rt);
 54     if(x<=mid) return query(x,l,mid,rt<<1);
 55     else return query(x,mid+1,r,rt<<1|1);
 56     //pushup(rt);
 57 }
 58 }s;
 59 ull qpow(ull x,ull y,int p,int &fl)
 60 {
 61     ull ans=1;
 62     if(y==0) return 1;
 63     if(x>=p) x%=p,fl=1;
 64     while(y){
 65         if(y&1){
 66             if(ans*x>=p) 
 67                 ans=ans*x%p,fl=1;
 68             else ans=ans*x;
 69         }
 70         if(x*x>=p)
 71             x=x*x%p,fl=1;
 72         else x=x*x;
 73         y>>=1;
 74     }return ans;
 75 }
 76 ull euler(int i,int ma,int p,int &fl)
 77 {
 78     ull ai=s.query(i,1,n,1);
 79     if(p==1) {fl=1;return 0;}
 80     if(ai>=p) fl=1;
 81     if(ai%p==0) return 0;
 82     if(ai==1) {fl=0;return 1;}
 83     int o=0;ai%=p;
 84     if(i==ma) return ai;
 85     ull ans=euler(i+1,ma,phi[p],o);
 86     if(o==1) fl=1; 
 87     /*if(ans==0){
 88         if(o){
 89             if(ai%p==0) {return 0;}
 90             else return qpow(ai,ans+phi[p],p,fl);
 91         }else{
 92             return 1;
 93         }
 94     }else{
 95         if(o) return qpow(ai,ans+phi[p],p,fl);
 96         else return qpow(ai,ans,p,fl);
 97     }*/
 98     if(ans==0&&o&&ai==0) return 0;
 99     else if(o) return qpow(ai,ans+phi[p],p,fl);
100     else return qpow(ai,ans,p,fl);
101 }
102 
103 int main()
104 {
105     //freopen("t2.in","r",stdin);
106     //freopen("testdata.in","r",stdin);
107     //freopen("a.out","w",stdout);
108     int fl,x,y,z;
109     scanf("%d%d",&n,&m);
110     Pre();
111     for(int i=1;i<=n;i++)
112         x=gint(),s.update(i,i,1,n,1,x);
113     for(int i=1;i<=m;i++)
114     {
115         fl=gint(),x=gint(),y=gint(),z=gint();
116         if(fl==1){
117             s.update(x,y,1,n,1,z);
118         }else{
119             int fl=0;
120             printf("%llu\n",euler(x,y,z,fl));
121         }
122     }
123     return 0;
124 }

 

转载于:https://www.cnblogs.com/guapisolo/p/10001422.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel android 公式,两个超实用的Excel万能公式,瞬间提升你10倍工作效率!

相信大家在平时的工作中&#xff0c;都会经常有用到公式的需要&#xff0c;但是下面这些公式你用过吗&#xff0c;今天小编就带大家一起看看吧&#xff01;1. SUM函数这个函数不仅在我们学习的过程中会用到&#xff0c;即便到了工作后&#xff0c;也经常需要对各种数据进行处理…

医疗:EMR(5)

电子病历&#xff08;EMR,Electronic Medical Record&#xff09;&#xff0c;也叫计算机化的病案系统或称基于计算机的病人记录&#xff08;CPR,Computer-Based Patient Record&#xff09;。它是用电子设备&#xff08;计算机、健康卡等&#xff09;保存、管理、传输和重现的…

Linux中常用命令(文件与目录)

1、pwd 查看当前目录&#xff08;Print Working Directory&#xff09;2、cd 切换工作目录&#xff08;Change Directory&#xff09;&#xff08;1&#xff09;格式&#xff1a;cd [目录位置]特殊目录&#xff1a;.当前目录..上一级目录~用户主目录-上个工作目录&#xff08;2…

计算机操作系统(1):OS的作用和目标

OS的目标和作用 操作系统&#xff08;Operating System , OS&#xff09;是计算机硬件上的第一层软件&#xff0c;是计算机必须配置的最基本、最重要的系统软件。 1.1.1 OS的目标 有效性 方便性 可扩展性 开放性 1&#xff0e;有效性(早期OS的主要目标) 有效提高CPU和…

android p 权限控制,android 权限控制

android6 的权限分为几个级别&#xff0c;普通的第三方应用一般会用到 normal dangerous 。系统应用可能会用到 signature|system signature|privileged signature,详细的信息在Manifest中定义vim frameworks/base/core/res/AndroidManifest.xml其中&#xff0c;只有定义为dang…

计算机操作系统(2):OS的发展过程

1.2 OS的发展过程 20世纪50年代中期&#xff0c;第一个简单的批处理系统 60年代中期&#xff0c;多道程序批处理系统&#xff0c;随后出现分时系统 上世纪80年代开始至21世纪初&#xff0c;微型机、多处理机、计算机网络大发展年代→微机OS、多处理机OS和网络OS的形成和大发展…

创建好centos7虚拟机之后连xshell连不上虚机

创建好虚拟机之后配置都已经配置完成了selinux&#xff0c;防火墙都关了准备用xshell 连接虚拟机报出 然后在网上着了各种资料还是不行&#xff0c;最后将网卡修改为&#xff1a; 修改之后就可以连上了。 当然修改之后会出现两个ip 必须得使用圈起来的ip连才可以&#xff0c;用…

android滑动开关框架,Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件&#xff0c;所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。这里有一个示例代码&#xff0c;它包括三个类&#xff1a;开关组件视图、状态监听接口、MainActivity我们先来看看整个demo的效果图&#xff1a;我们先来看看…

计算机操作系统(3):操作系统的基本特征

1.3 操作系统的基本特征 1.3.1 并发&#xff08;Concurrence&#xff09; 并行与并发&#xff1a; 并行性——两个或多个事件在同一时刻发生 并发性——两个或多个事件在同一时间间隔内发生 在多道程序环境下&#xff0c;并发性是指在一段时间内&#xff0c;宏观上有多…

最简单的docker教程:在docker里运行nginx服务器

命令行docker search nginx搜索名为nginx的docker image&#xff0c;返回结果的第一个&#xff0c;github上有10293个star&#xff0c;这就是我们想要搜索的结果&#xff1a; 使用命令docker pull把这个镜像拖下来&#xff1a; docker pull nginx 然后以detach模式运行这个镜像…

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

1.简单使用同步&#xff1a;Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed true;}try {client.dispatcher().executed(this);Response result getRe…

H5实现轮播

页面代码&#xff1a; <div id"body_wrapper" class"container"><article><section id"lunbotu"><div class"wrap"><div id"slide-holder"><div id"slide-runner"><a hre…

计算机操作系统(4):操作系统的重要功能

1.4 操作系统的主要功能 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 用户接口 1处理机管理功能 也可称为进程管理在传统的多道程序设计系统中&#xff0c;处理机的分配和运行&#xff0c;都是以进为基本单位的&#xff0c;因而对处理机的管理&#xff0…

html5本地存储论坛,Web Storage--HTML5本地存储

什么是Web StorageWeb Storage是HTML5里面引入的一个类似于cookie的本地存储功能&#xff0c;可以用于客户端的本地存储&#xff0c;其相对于cookie来说有以下几点优势&#xff1a;存储空间大&#xff1a;cookie只有4KB的存储空间&#xff0c;而Web Storage在官方建议中为每个网…

计算机操作系统(5):操作系统的结构设计

1.5 操作系统的结构设计 OS的结构经历了四代变革&#xff1a; 微内核OS结构——现代OS结构 微内核结构能有效地支持多处理机运行&#xff0c;故非常使用于分布式系统环境。 Windows NT采用微内核结构 在与微内核技术发展的同时&#xff0c;客户/服务器技术、面向对象技术…

Linux软链接和硬链接

Linux软链接和硬链接 1. 软链接link 定义&#xff1a;就是windows系统的快捷方式 作用&#xff1a;可以对硬盘空间进行合理分配 具体设置&#xff1a; ln -s 源文件 软链接 1.1 软链接使用注意 ① 设置软链接&#xff0c;如果软链接和源文件不在同一级目录&#xff0c;原…

编写HTML提高编写代码的效率,优化innerHTML操作(提高代码执行效率)

例子&#xff1a;我们要实现的效果是当用户点击鼠标的时候&#xff0c;就在旧数据上追加若干新数据。如果使用标准DOM的话&#xff0c;完整代码如下&#xff1a;testdatadocument.onmousedown function() {for (var i 0; i < 10; i) {var p document.createElement("…

计算机操作系统(6):练习题

1&#xff0e;计算机操作系统的功能是 d 。 A. 把源程序代码转换为目标代码 B. 实现计算机用户之间的相互交流 C. 完成计算机硬件与软件之间的转换 D. 控制、管理计算机系统的资源和程序的执行 2&#xff0e;____a__不是分时系统的特点。 A&#xff0e;多个用户是…

router锚点和html锚点,hash模式下Vue-router页面返回锚点(scroll behavior)实现

在普通页面中&#xff0c;点击浏览器的返回按钮&#xff0c;在返回到上一页时会处在上次浏览的位置。单页面应用中&#xff0c;由于始终是同一个页面&#xff0c; 因此需要自行实现页面返回时的锚点。Vue-router的Scroll Behavior可以用于解决这个问题&#xff0c;但是只能应用…

医疗:OA(6)

办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统办公方式&#xff0c;进而形成的一种新型办公方式。办公自动化利用现代化设备和信息化技术&#xff0c;代替办公人员传统的部分手动或重复性业务活动…