gym 102875A – Array

题意:

对于一个数组a,以及数p,
q个操作
1.对于区间[l,r],里面所有数+k
2.对于区间[l,r],里面所有数 * k
3.对于区间[l,r],里面所有数变成k次幂
4.对于区间[l,r],输出里面所有数k次幂的和
5.对于区间[l,r],输出里面所有数的乘积
操作4和5的结果mod p
1<=n<=1e5
2<=p<=30
0<=a<=1e9
1<=q<=1e5
注:我们规定00 = 1

题解:

参考题解
参考题解
第一个题解的方法很妙,因为p的范围很小,所以可以直接用线段树来维护每个区间值为x的数有多少个,f数组用来记录每个数转移成了什么数
num[root<<1][f[root][i]] = num[root<<1][i]
第二个方法在计算快速幂时用欧拉降幂来优化下常数


4月26再看这题
在刷了很多树之后,有些感觉。。但感觉让自己写还是写不出
num[root][i]以root为根的子树中有多少个i
f[root][i] 表示以root为根的子树中原本的i转移成了什么数
因为p很小,所以可以将mod值和pow值(记得取模)提前求好
代码很妙,思路也很好,是个好题

代码:

#include<bits/stdc++.h>
using namespace std;
#define G if(++ip==ie)if(fread(ip=buf,1,SZ,stdin))
#define ri register int
#define iv inline void
using namespace std;
const int SZ=1<<19;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int in(){G;while(*ip<'-')G;ri x=*ip&15;G;while(*ip>'-'){x*=10;x+=*ip&15;G;}return x;
}
const int N=1e5+5;
int p;
int num[N*4][35],f[N*4][35];
int tmp[35];
void push_down(int root){for(int i=0;i<p;i++){tmp[i]=num[root<<1][i];num[root<<1][i]=0;} for(int i=0;i<p;i++){num[root<<1][f[root][i]]+=tmp[i];}for(int i=0;i<p;i++){tmp[i]=num[root<<1|1][i];num[root<<1|1][i]=0;}for(int i=0;i<p;i++){num[root<<1|1][f[root][i]]+=tmp[i];}for(int i=0;i<p;i++){f[root<<1][i]=f[root][f[root<<1][i]];f[root<<1|1][i]=f[root][f[root<<1|1][i]];}for(int i=0;i<p;i++)f[root][i]=i;
}
int a[N];
void build(int l,int r,int root){for(int i=0;i<p;i++)f[root][i]=i;if(l==r){num[root][a[l]]=1;return ;}int mid=l+r>>1;build(l,mid,root<<1);build(mid+1,r,root<<1|1);for(int i=0;i<p;i++)num[root][i]=num[root<<1][i]+num[root<<1|1][i];
}
int quik(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
int mod[N];
int qpow[35];
/*
num[root][i]以root为根的子树中有多少个i
f[root][i] 表示以root为根的子树中原本的i转移成了什么数
*/
void update(int l,int r,int root,int ql,int qr,int op,int v){if(l>=ql&&r<=qr){if(op==2){//mulfor(int i=0;i<p;i++){tmp[i]=num[root][i];num[root][i]=0;}for(int i=0;i<p;i++){num[root][mod[i*v]]+=tmp[i];f[root][i]=mod[f[root][i]*v];}}else if(op==1){//addfor(int i=0;i<p;i++){tmp[i]=num[root][i];num[root][i]=0;}for(int i=0;i<p;i++){num[root][mod[(i+v)]]+=tmp[i];f[root][i]=mod[(f[root][i]+v)];}}else if(op==3){//^kfor(int i=0;i<p;i++){tmp[i]=num[root][i];num[root][i]=0;}for(int i=0;i<p;i++){num[root][qpow[i]]+=tmp[i];f[root][i]=qpow[f[root][i]];}}return ;}push_down(root);int mid=l+r>>1;if(mid>=ql)update(l,mid,root<<1,ql,qr,op,v);if(mid<qr)update(mid+1,r,root<<1|1,ql,qr,op,v);for(int i=0;i<p;i++)num[root][i]=num[root<<1][i]+num[root<<1|1][i];
}
int ans[35];
void query(int l,int r,int root,int ql,int qr){if(l>=ql&&r<=qr){for(int i=0;i<30;i++)ans[i]+=num[root][i];return ;}push_down(root);int mid=l+r>>1;if(mid>=ql)query(l,mid,root<<1,ql,qr);if(mid<qr)query(mid+1,r,root<<1|1,ql,qr);
}
int main()
{int n;n=in(),p=in();for(int i=1;i<=n;i++)a[i]=in(),a[i]%=p;for(int i=0;i<35*35;i++)mod[i]=i%p;build(1,n,1);int q;q=in();while(q--){int op,l,r,k;op=in(),l=in(),r=in(),k=in();if(op<=2)k%=p;else if(op==3){for(int i=0;i<p;i++)qpow[i]=quik(i,k);}if(op<=3)update(1,n,1,l,r,op,k);else {for(int i=0;i<p;i++)ans[i]=0;query(1,n,1,l,r);if(op==4){int sum=0;for(int i=0;i<p;i++)sum=(sum+quik(i,k)*ans[i])%p;printf("%d\n",sum);}else {int sum=1;for(int i=0;i<p;i++)sum=sum*quik(i,ans[i])%p;printf("%d\n",sum);}}}return 0;
}

gym 102875A -- Array(未更新完)相关推荐

  1. linux学习心得(未更新完)

    2022.9.18 1. Linux文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",根目录下的第一子目录是规定好的,名称与用途是确定了的,例如: /root目 ...

  2. 自然语言处理中的数据获取与清洗总结(未更新完)

    文章目录 一.数据获取 1.requests 2.BeautifulSoup 3.selenium 和 PhantomJS 4.总结 二. 数据清洗 1.数据清洗流程 2.切句命令 3.中英判断 4. ...

  3. 2014年12月2日更新完英雄联盟一直显示无法连接服务器,【致想玩韩服LOL的Mac用户】macOS Sierra[10.12.4可用]下安装英雄联盟新客户端并连接到韩服服务器...

    本帖子致那些想玩韩服LOL的Mac用户 首先,之前我写过一篇帖子是针对Mac用户用旧客户端玩韩服的,不过Riot Games于2017年4月24日废弃旧客户端,在这段时间到2017年5月6日内,均可以 ...

  4. 使用改进的YOLO-V4网络实时检测水产养殖水下图像中未吃完的饲料颗粒

    原文链接: <Real-time detection of uneaten feed pellets in underwater images for aquaculture using an ...

  5. 全球 PC 应用程序有半数已过期未更新

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   据防病毒软件 Avast 官方公布的一份 PC 安全报告,显示了全球 PC 上安装的应用软件有55%是过期软件,恐增加 PC 的风险.数据显 ...

  6. 【原创】CSSOO的思想及CSS框架的应用(未整理完)

    CSSOO的思想及CSS框架的应用 前语:通过这次研究分析总结,个人对CSSOO的概念及应用的思路也更明确一些,是一个和大家共同学习的过程. 一.CSS框架 框架目的: 给出一个相对规范的开发方法,给 ...

  7. java或者jsp中修复会话标识未更新漏洞

    appscan扫描出来的. 1. 漏洞产生的原因: AppScan会扫描"登录行为"前后的Cookie,其中会对其中的JSESSIONOID(或者别的cookie id依应用而定) ...

  8. 会话标识未更新 java_Appscan漏洞之会话标识未更新

    本次针对 Appscan漏洞 会话标识未更新进行总结,如下: 1. 会话标识未更新 1.1.攻击原理 在认证用户或者以其他方式建立新用户会话时,如果不使任何现有会话标识失效,攻击者就有机会窃取已认证的 ...

  9. oracle 修改序列末值,当ViewModel值更改时,用户界面未更新

    我已经创建了示例应用程序来演示我的问题: 一 TextView 和A Button ,文本视图可见性绑定到 viewModel.bar 我想让按钮切换 查看模型 当单击时,用户界面也会得到更新. 然而 ...

最新文章

  1. Scala传名参数(By-Name)
  2. 小技巧 —— linux中怎么简单的复制5000个数字
  3. 信号与系统 徐亚宁 matlab程序,信号与系统(第4版)
  4. 为什么选择react?为前端开发选择React的六大理由
  5. 360 n6 linux内核版本,五年26个版本:Linux系统内核全程回顾
  6. 面向面试编程-概念之-分布式与集群的区别和联系
  7. java中chl列表_Java 同步框架 AQS 深入分析
  8. ORL、Yale等人脸数据库百度云链接
  9. 数字大写;大写的一到十;…
  10. [Java] 利用xpdf库获取pdf文件的指定范围文本内容
  11. 微信小程序开挂模式即将启动
  12. 利用pytorch训练好的模型测试单张图片
  13. 计算机原理与体系结构王海瑞答案,袁梅
  14. 绝对优势与比较优势的数学分析与其…
  15. 代码远程调用aria2实现URL资源或BT种子下载
  16. 【代码】eclipse搭建ssm框架所需约束
  17. 刚刚开通,感受一下此地气氛
  18. 苹果6手机服务器停止响应,iphone6被停用怎么办?苹果6被停用解决方法汇总
  19. DiskLruCache源码解析
  20. AI教程之 Stable Diffusion在自己电脑上运行稳定的AI自动艺术创作

热门文章

  1. qt4.7 mysql_详解Qt 4.7编译和访问Mysql驱动
  2. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  3. sql重新注册服务器,sql server无法新建注册服务器怎么办?
  4. linux脚本开机挂载,案例七:shell实现开机自动挂载本地YUM仓库程序
  5. Linux下ms软件,在linux下有没有什么软件可以连接windows上的MSSQL SERVER
  6. 中科大计算机是一流学科吗,安徽2017双一流学科排行榜:中国科技大学第一
  7. 用java程序实现记单词_java实现背单词程序
  8. python中csv文件把成绩加入_【学习笔记】python3中csv文件使用
  9. python3 for循环_从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列
  10. mysql 拷贝安装_Mysql的安装和主从复制